实体框架:无法创建类型“System.Collections.Generic.IList”1的常量值 [英] Entity Framework: Unable to create a constant value of type 'System.Collections.Generic.IList`1'

查看:1285
本文介绍了实体框架:无法创建类型“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.MaxPrice))&&
(criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any (j => 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)。


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



我已经尝试改变这一行,但没有起作用。

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


解决方案

恒定值EF不能创建是 null 用于比较 criteria.Locations ==空。您需要将查询分为两种情况,并对查询之外的空列表进行检查,例如:

  var result = DataContext.Accommodations.Where(a => 
(criteria.MinPrice == null ||
a.AccommodationRates.Any(r => r。从> = criteria.MinPrice))&&b $ b(criteria.MaxPrice == null ||
a.AccommodationRates.Any(r => r.To< = criteria.MaxPrice) ));

if(criteria.Locations!= null&& standard.Locations.Count> 0)
{
result = result.Where(a => a。住宿地点
.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)));


This has caused me no end of problems today. I have this simple query

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)) &&
        (criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName)))
);

The last line of this query is causing me problems

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

The error it gives is

Unable to create a constant value of type 'System.Collections.Generic.IList`1'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

I'm not even trying to create a list. All I'm trying to do here is bring back accommodations which are associated to a place (where the place name in the Place table which is linked to the Accommodation table via the AccommodationPlaceJoin table) is equal to any one of the place names in criteria.Locations (which is of type IList).

I've tried changing this line to this, but it didn't work.

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

解决方案

The constant value EF can't create is null for the comparison criteria.Locations == null. You need to split the query into two cases and do the check for the empty list outside of the query, for example like so:

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

Edit

BTW: Composing the whole query would make it better readable in my opinion and will simplify the SQL that has to be sent to the database:

IQueryable<Accommodation> 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)));

这篇关于实体框架:无法创建类型“System.Collections.Generic.IList”1的常量值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆