entity framework:无法创建类型为’System.Collections.Generic.IList`1’的常量值

这使我今天无法解决问题。 我有这个简单的查询

var result = DataContext.Accommodations.Where(a => (criteria.MinPrice == null || a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && (criteria.MaxPrice == null || a.AccommodationRates.Any(r => r.To  criteria.Locations.Contains(j.Place.PlaceName))) ); 

此查询的最后一行导致我出现问题

 (criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName))) 

它给出的错误是

无法创建类型为’System.Collections.Generic.IList`1’的常量值。 在此上下文中仅支持基本类型(例如Int32,String和Guid’)。

我甚至没有尝试创建列表。 我在这里尝试做的就是带回与一个地方相关的住宿(Place表中通过AccommodationPlaceJoin表链接到住宿表的地名)等于标准中的任何一个地名.Locations(属于IList类型)。

我已经尝试将此行更改为此,但它不起作用。

 (criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any(j => criteria.Locations.Any(l => l == j.Place.PlaceName))) 

对于比较criteria.Locations == null ,常量值EF无法创建为null criteria.Locations == null 。 您需要将查询拆分为两种情况,并检查查询外的空列表,例如:

 var result = DataContext.Accommodations.Where(a => (criteria.MinPrice == null || a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) && (criteria.MaxPrice == null || a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice))); if (criteria.Locations != null && criteria.Locations.Count > 0) { result = result.Where(a => a.AccommodationPlaceJoins .Any(j => criteria.Locations.Contains(j.Place.PlaceName))); } 

编辑

BTW:在我看来,编写整个查询会使其更易读,并简化必须发送到数据库的SQL:

 IQueryable result = DataContext.Accommodations; if (criteria.MinPrice != null) result = result.Where(a => a.AccommodationRates .Any(r => r.From >= criteria.MinPrice)); if (criteria.MaxPrice != null) result = result.Where(a => a.AccommodationRates .Any(r => r.To <= criteria.MaxPrice)); if (criteria.Locations != null && criteria.Locations.Count > 0) result = result.Where(a => a.AccommodationPlaceJoins .Any(j => criteria.Locations.Contains(j.Place.PlaceName)));