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

时间:2012-05-15 19:48:54

标签: c# linq linq-to-entities exists

使用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')。”

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

2 个答案:

答案 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();