如何在LINQ to SQL中使用List创建动态where子句?

时间:2010-08-31 19:12:07

标签: c# asp.net sql linq 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 });

我需要替换的具体行是

,其中 amenities_list.Contains(at.id)

相反,它需要像这样生成SQL([at.id] = 29 AND [at.id] = 30 AND [at.id] = 40)

那么如何让我的List在LINQ to SQL中生成上述SQL代码。

1 个答案:

答案 0 :(得分:0)

请为你的条款创建方法,你吓到我了。

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 }); 

如果你的意思是at.is = 29或at.id = 30或at.id = 40,那么使用AtIdIsValid(at.id)谓词,如:

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