使用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,String和Guid')。”
如何在数据库服务器上实现此类查询?
答案 0 :(得分:3)
嗯,一个选择是使用联接:
files = files.Join(repository.FileInfo.Where(i => i.Foo == "bar"),
f => f.FileId,
i => i.FileId,
(f, i) => f)
.Distinct();
我不希望这必须转换为SQL中的EXISTS查询,但是看一下查询计划,它可能会做同样的事情......
答案 1 :(得分: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();