使用Entity Framework时的EF - AND NOT EXISTS (SELECT 1 ...)问题

21

我正在尝试在我的ASP.NET MVC项目中使用Entity Framework运行此查询,但我没有成功。有人可以帮助我使用LINQ完成这个查询吗?

SELECT p.*
FROM Produtos p
WHERE p.enterpriseID = '00000000000191' and p.productId <> '14' 
AND NOT EXISTS (SELECT 1 FROM SimilarProducts sp WHERE sp.similarId = 
p.productId)

表格:

PRODUCT                        SIMILARPRODUCTS
productId|enterpriseId         id|productId|similarId
3个回答

32

在 LINQ 中,与 SQL 的 NOT EXISTS (...) 直接对应的构造是 !Any(...)

因此,

SELECT p.*
FROM Produtos p
WHERE p.enterpriseID = '00000000000191' and p.productId <> '14' 
AND NOT EXISTS (SELECT 1 FROM SimilarProducts sp WHERE sp.similarId = 
p.productId)

翻译成

from p in db.Produtos
where p.enterpriseID = "00000000000191" && p.productId != 14 
&& !db.SimilarProducts.Any(sp => sp.similarId == p.productId)
select p;

13
你可以使用带有 AnyContains,它的作用类似于 SQL 中的 NOT EXISTS。像这样:
var restuls = db.Produtos.Where(p => p.enterpriseID == '00000000000191' 
                 && p.productId != 14 
                 && !db.SimilarProducts.Any(sp =>sp.SimilarId == p.productId));

你之前在使用<>符号表示不等于条件,但是linq不支持该符号。 - Govinda Rajbhar
你好,非常感谢你的回答。逻辑是正确的,但是我的代码中这个linq的上下文是错误的!Contains方法只接受一个字符串参数。 - GustavoZafra
@vtncgustavo - 在你的情况下,上下文是什么? - Mahmoud Gamal
错误在于Contains(sp => sp.Similar Id == p.productId)的参数,它不将其识别为参数。 - GustavoZafra

2

EF Contains => sql in() :遍历所有项(较慢)

EF Any => sql exists() :迭代直到条件返回 true(较快)

 await appDbContext.MasterTable
.Where(m => !m.DetailTable.Any(d => d.MasterId == m.Id))
.ToListAsync();

这个重复了其他两个答案。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接