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)))
- 左joinLINQ到实体?
- entity frameworkSaveChanges()与SaveChangesAsync()和Find()与FindAsync()
- entity framework6.0下的ORM实体与域实体
- 实体typesApplicationUser不是当前上下文的模型的一部分
- 使用Asp.Net身份数据库第一种方法
- EF 4.1 – Code First – JSON循环引用序列化错误
- 从entity framework元数据获取数据库表名
- C#entity framework:如何结合模型对象上的.Find和.Include?
- 如何比较只有date时间DateTimetypesLinq to SQL与entity framework?