开发者

How do I create a dynamic where clause using a List in LINQ to SQL?

 var query_loc = (from at in db.amenities_types
                     join a in db.amenities on at.id equals a.amenities_type
                     join u in db.unitInfos on a.unit_id equals u.id
                     join l in db.locations on u.locations_id equals l.id
                     join o in db.organizations on l.organization_id equals o.id
                     join ot in db.organization_types 开发者_开发百科on o.id equals ot.organization_id
                     where (((u.price >= low_rent) && (u.price <= high_rent)) 
                              || (u.price == null))
                     && (u.bedrooms <= beds) && (u.bathrooms <= baths)
                     && amenities_list.Contains(at.id)
                     && (((ot.active == true) && (DateTime.Now <= ot.deactivateDate))
                          || ((ot.active == true) && (ot.deactivateDate == null)))
                         && (((l.active == true) && (DateTime.Now <= l.deactivateDate))
                          || ((l.active == true) && (l.deactivateDate == null)) )
                     && (ot.type == 8)
                     orderby o.name ascending, l.name ascending
                     select new { l, o, u, ot, at });

The specific line I need to replace is

where amenities_list.Contains(at.id)

Instead it needs to produce SQL like this ([at.id] = 29 AND [at.id] = 30 AND [at.id] = 40)

So how do I get my List to produce the above SQL code in LINQ to SQL.


Please create methods for your clauses, you are scaring me.

var query_loc = (from at in db.amenities_types 
                 join a in db.amenities on at.id equals a.amenities_type 
                 join u in db.unitInfos on a.unit_id equals u.id 
                 join l in db.locations on u.locations_id equals l.id 
                 join o in db.organizations on l.organization_id equals o.id 
                 join ot in db.organization_types on o.id equals ot.organization_id 
                 where
                    PriceIsValid(u)
                 && BedsAndBathsArevalid(u) 
                 && AtIdIsValid(at.id)
                 && SomeCrazyDateConditionIsValid(ot, l)
                 && TheOtTypeIsValid(ot)
                 orderby o.name ascending, l.name ascending 
                 select new { l, o, u, ot, at }); 

And if you mean at.is = 29 OR at.id = 30 OR at.id = 40, then use an AtIdIsValid(at.id) predicate like:

bool AtIdIsValid(int atId){ return (atId == 29 || atId == 30 || atId == 40); }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜