我遇到了linq的问题,我将在例子中解释:
我有一个名为Employee的数据库表,它获得了FirstName和LastName列, 以及搜索获取nameList列表作为参数的员工的方法,此列表中的元素是格式化为“Fred Burn”或this1“Grim Reaper”的名称, 已经尝试过这些方法没有运气= [
//just all employees
var allData = from emp in Context.Employee select emp;
var test1 = from emp in allData
where(emp.FirstName + " " + emp.LastName).Contains
("" + ((from n in nameList select n).FirstOrDefault()))
select emp;
var test2 = (from emp in allData
where (emp.FirstName + " " + emp.LastName)
== ((from n in nameList select n).FirstOrDefault())
select emp);
var test3 = from emp in allData
where (from n in nameList select n).Contains
(emp.FirstName + " " + emp.LastName)
select emp;
第一个和第二个查询给出:{“无法创建类型'闭包类型'的常量值。在此上下文中仅支持基本类型(例如Int32,String和Guid')。”} exception
和第三:{“LINQ to Entities无法识别方法'Boolean Contains [String](System.Collections.Generic.IEnumerable`1 [System.String],System.String)'方法,这个方法无法转化为商店表达。“}
很高兴听到你的建议:)
谢谢!
附:
是的,我知道可以在列表中拆分名称并单独比较它们,但仍然很好奇为什么这些查询不起作用。
答案 0 :(得分:2)
我假设在这种情况下nameList是一个内存集合,并且您正在尝试使用LINQ to SQL技巧在Entity Framework内部创建SQL“IN”子句。不幸的是,EF还不支持这种语法。根据您尝试匹配的记录数量,您可以为您想要的每个孩子运行单独的查询。或者,您可以使用串联构建实体SQL查询,以将名称列表中的多个项目作为WHERE操作中的单独OR子句追加。