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")。

如何在数据库服务器上实现此类查询?

Linq to Entities 在另一个表中为 EXISTS 查找添加 Where 子句

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 查询,但看看查询计划,它很可能在做同样的事情......