1

使用 Linq to Entities,我有一个IQueryable<T>并且想要添加另一个 WHERE 子句,它相当于EXISTSSQL 中的一个子句。我不需要实际从另一个表中提取任何数据,只需检查是否满足条件即可过滤结果。这是我最近的尝试:

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、String和Guid')。”

您如何在数据库服务器上实现这种类型的查询?

4

2 回答 2

3

好吧,一种选择是使用连接:

files = files.Join(repository.FileInfo.Where(i => i.Foo == "bar"),
                   f => f.FileId,
                   i => i.FileId,
                   (f, i) => f)
             .Distinct();

我不希望这一定会转化为 SQL 中的 EXISTS 查询,但看看查询计划,它很可能会做同样的事情......

于 2012-05-15T19:55:36.753 回答
3
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();
于 2012-05-15T20:59:43.220 回答