【发布时间】:2010-10-22 10:48:40
【问题描述】:
我在将以下 SQL 语句转换为 LINQ-to-entities 时遇到问题:
SELECT l.*
FROM locations l
WHERE l.id NOT IN (/* array of ids */)
在 LINQ 中,我希望看到类似的内容(其中 myCollection 是要排除的项目的通用列表):
IQueryable<Location> locationQuery = from l in DataContext.Location
where !myCollection.Contains(l)
select l;
但这不起作用,因为 Contains 在 LINQ-to-entities 中不可用(如我所见)。在我最好/最接近的 LINQ 尝试中,我有我的位置集合(一个列表),我有一个 DataContext,它从数据库中检索所有现有的位置:
List<Location> Route = new List<Location>();
// Some code to add Location entities from the DB to the Route collection
var innerQuery = from p in Route
select p.ID;
IQueryable<Location> locationQuery = from l in DataContext.Location
where !((innerQuery).Any(k => k == l.ID))
select l;
显然我想从数据库中获取不在我本地集合中的所有位置。但是代码会引发 NotSupportedException 声明:
无法创建“闭包类型”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。
我一直在摆弄它,使用不同的方法,但我就是无法让它工作。现在我已经读到 LINQ-to-entities 无法进行高级比较(对象级别),这可能解释了上述错误。
我的实际问题是,我如何在 LINQ 中做我可以在 SQL 中如此轻松地做的事情?我只想从数据库中选择一堆实体,不包括本地(非数据库)集合中存在的实体。
【问题讨论】:
-
欢迎使用 LINQ-to-Entities,它是功能不足的 LINQ-to-SQL 的替代品...
-
我在这里提出了类似的转换问题; stackoverflow.com/questions/4093592/… 我还没有解决这个问题。看来您可以在 LinqToSql 中执行许多您无法在 EF 中执行的操作。这很烦人/令人失望。你的问题有点不同,但最终结果是相似的。我希望你比我更成功。
标签: c# linq linq-to-entities