我有一个对象IQueryable,我试图动态添加Where子句,这对于Listing对象的列非常有用,但是现在有条件地我想将一个IN子句添加到一个导航属性(ListingAmenities),它有列的ListingID, AmenityID
我有critiera.AmenityIDs,其中可能包含我喜欢过滤结果的设施。
如果我的数组中有任何amenityID,我试图实现以下功能
select * from Listings l inner join ListingAmenities a on l.ListingID = a.ListingID where a.AmenityID IN(1,2,3)
这是我的代码(我正在使用EF5)
if (criteria.AmenityIDs.Count > 0)
{
listings = listings.Where(x => x.ListingAmenities.Any(y => y.AmenityID == criteria.AmenityIDs));
}
当然不起作用。 重要的是我正在动态添加这些WHERE子句,这就是我构建IQueryable对象的原因
答案 0 :(得分:1)
Enumerable.Contains
在SQL中转换为IN
,因此您可以使用:
if (criteria.AmenityIDs.Count > 0)
{
listings = listings.Where(x => x.ListingAmenities
.Any(y => criteria.AmenityIDs.Contains(y.AmenityID)));
}
AmenityIDs
集合很长,因为Contains
有performance problems for large collections,所以要小心。但是100个元素左右应该不是问题。