entity framework – “无法创buildtypes'闭包types'…”的错误的常量值

为什么我得到这个错误:

无法创buildtypes为“封闭types”的常量值。 在此上下文中只支持基本types(例如Int32,String和Guid)。

当我尝试枚举下面的Linq查询?

IEnumerable<string> searchList = GetSearchList(); using (HREntities entities = new HREntities()) { var myList = from person in entities.vSearchPeople where upperSearchList.All( (person.FirstName + person.LastName) .Contains).ToList(); } 

更新 :如果我尝试以下尝试隔离问题,我得到相同的错误:

 where upperSearchList.All(arg => arg == arg) 

所以看起来问题是所有的方法,对不对? 有什么build议么?

看起来你正在试图做一个“WHERE … IN”的条件。 查阅如何使用LINQ to Entities编写“WHERE IN”样式查询,以获取如何使用LINQ to Entities进行该types查询的示例。

另外,我认为这个错误信息在这种情况下特别没有帮助,因为.Contains之后没有括号,这就导致编译器将整个谓词识别为lambdaexpression式。

我已经花费了6个月时间与EF 3.5战斗,但我并不是世界上最聪明的人,我非常肯定我有一些有用的东西可以提供这个话题。

生成50英里高的“OR风格”expression式树所生成的SQL将导致较差的查询执行计划。 我正在处理几百万行,影响是巨大的。

有一点我发现做一个SQL'入',这有助于如果你只是通过ID寻找一堆实体:

 private IEnumerable<Entity1> getByIds(IEnumerable<int> ids) { string idList = string.Join(",", ids.ToList().ConvertAll<string>(id => id.ToString()).ToArray()); return dbContext.Entity1.Where("it.pkIDColumn IN {" + idList + "}"); } 

其中pkIDColumn是您的Entity1表的主键ID列名称。

但请继续阅读!

这很好,但它需要我已经有我需要find的ID。 有时我只想让自己的expression方式进入其他关系,而我所拥有的就是这些关联关系的标准。

如果我有更多的时间,我会尝试用视觉来表示,但是我不这样认真研究这个句子:考虑一个带有Person,GovernmentId和GovernmentIdType表的模式。 Andrew Tappert(Person)有两张身份证(GovernmentId),一张来自俄勒冈州(GovernmentIdType),一张来自华盛顿(GovernmentIdType)。

现在从它生成一个edmx。

现在想象一下你想find所有具有特定ID值的人,比如1234567。

这可以通过一个单一的数据库来完成:

 dbContext context = new dbContext(); string idValue = "1234567"; Expression<Func<Person,bool>> expr = person => person.GovernmentID.Any(gid => gid.gi_value.Contains(idValue)); IEnumerable<Person> people = context.Person.AsQueryable().Where(expr); 

你在这里看到子查询吗? 生成的SQL将使用“连接”而不是子查询,但效果是相同的。 现在,SQL服务器将子查询优化为封装下的连接,但无论如何…

这个工作的关键是内部的expression。

我find了错误的原因(我正在使用Framework 4.5)。 问题是,在“包含”参数中传递的EF复杂types无法转换为SQL查询。 EF可以使用在一个SQL查询只有简单的types,如INT,string…

 this.GetAll().Where(p => !assignedFunctions.Contains(p)) 

GetAll提供了一个复杂types的对象列表(例如:“Function”)。 因此,我会尝试在这里接收我的SQL查询中的这种复杂types的实例,这自然不能工作!

如果我可以从我的列表中提取适合我的search的参数,我可以使用:

 var idList = assignedFunctions.Select(f => f.FunctionId); this.GetAll().Where(p => !idList.Contains(p.FunktionId)) 

现在EF不再有复杂types“function”的工作,但例如一个简单的types(长)。 那工作正常!

当我在.All函数中使用的数组对象为空后,我得到了这个错误信息在我初始化数组对象(upperSearchList在你的情况)后,错误消失在这种情况下错误信息是误导

where upperSearchList.All(arg => person.someproperty.StartsWith(arg)))