Linq to Entities 在另一个表中为 EXISTS 查找添加 Where 子句
本文关键字:查找 EXISTS 添加 Where 子句 Entities to 另一个 Linq | 更新日期: 2023-09-27 18:34:19
使用 Linq to Entities,我有一个IQueryable<T>
,想向其添加另一个 WHERE 子句,该子句等效于 SQL 中的EXISTS
子句。我不需要实际从另一个表中提取任何数据,只需检查是否满足条件即可过滤结果。这是我的最新尝试:
IQueryable<FileEntity> files = repository.Files.Where(...);
// More stuff done to files
files = files.Where(f => repository.FileInfo.Where(i => i.Foo == "bar")
.Select(i => t.FileId)
.Contains(f => f.FileId));
var list = files.ToList(); // ERROR!
我也尝试过这样的事情:
files = files.Where(f => repository.FileInfo.Any(i => i.FileId == f.FileId));
在任何情况下,例外情况都是 ol' "无法创建类型为'FileInfo'的常量值。在此上下文中仅支持基元类型("例如 Int32、字符串和 Guid")。
如何在数据库服务器上实现此类查询?
IQueryable<FileEntity> files = repository.Files.Where(...);
// More stuff done to files
var ids = repository.FileInfo.Select(i=>i.FileId).ToList();
var list = files.Where(f => ids.Contains(f.FileId)).ToList();
嗯,一种选择是使用连接:
files = files.Join(repository.FileInfo.Where(i => i.Foo == "bar"),
f => f.FileId,
i => i.FileId,
(f, i) => f)
.Distinct();
我不希望这必然转换为 SQL 中的 EXISTS 查询,但看看查询计划,它很可能在做同样的事情......