如何编写Linq(或lambda)语句来生成所有不在(或不存在)中的元素
以下是我的方案(表): 我想你有主意了。这里没有什么不寻常的 导入到EDMX文件OrderProductXREF时,表格是不可见的实体。我看到的只是导航属性:产品用于实体订单和订单用于实体产品 所以,我的问题是: 我需要Linq和/或Lambda语句,该语句将列出所有没有与任何订单关联的产品。或者,列出从未订购过的所有产品。 SQL应该是这样的:如何编写Linq(或lambda)语句来生成所有不在(或不存在)中的元素,linq,entity-framework,lambda,not-exists,Linq,Entity Framework,Lambda,Not Exists,以下是我的方案(表): 我想你有主意了。这里没有什么不寻常的 导入到EDMX文件OrderProductXREF时,表格是不可见的实体。我看到的只是导航属性:产品用于实体订单和订单用于实体产品 所以,我的问题是: 我需要Linq和/或Lambda语句,该语句将列出所有没有与任何订单关联的产品。或者,列出从未订购过的所有产品。 SQL应该是这样的: SELECT * FROM Products WHERE Id NOT IN (SELECT ProductId FROM Orde
SELECT * FROM Products
WHERE Id NOT IN
(SELECT ProductId
FROM OrderProductXREF)
编辑:
UH对不起,我的问题中忘记了一个小细节
以下是新的SQL:
SELECT * FROM Products
WHERE Id NOT IN
(SELECT ProductId
FROM OrderProductXREF
WHERE OrderID = 1)
换句话说,所有未按ID=1的订单订购的产品
谢谢道歉-事先误读了问题。我怀疑你想要:
var query = db.Products.Where(product => !product.Orders.Any());
不过,您肯定应该检查生成的SQL。我希望这是明智的,但如果不是,你可能会想看看其他的选择
编辑:要检查不符合订单ID 1的产品,您可能可以使用:
var query = db.Products.Except(db.Orders
.Where(order => order.Id == 1)
.Single()
.Products);
或:
道歉-事先误读问题。我怀疑你想要:
var query = db.Products.Where(product => !product.Orders.Any());
不过,您肯定应该检查生成的SQL。我希望这是明智的,但如果不是,你可能会想看看其他的选择
编辑:要检查不符合订单ID 1的产品,您可能可以使用:
var query = db.Products.Except(db.Orders
.Where(order => order.Id == 1)
.Single()
.Products);
或:
关于你的“一个小细节”:
关于你的“一个小细节”:
@CraigStuntz:在你发表评论之前和看到你的答案之前,我已经编辑过:)(我知道我们的答案非常相似,但我保留了我的答案作为替代,因为我相信这里的方法符号更干净-查询表达式只是增加了噪音。还有检查生成的SQL的建议。)
Any()
被翻译(无论如何,由SQL Server提供商提供)由于存在,这将产生一个合理的执行计划。@CraigStuntz:这当然是我希望的。我可能仍然会检查:)谢谢大家。请看我的编辑上面。忘了一个小细节。如果我想列出未按ID=1的顺序订购的产品,该怎么办?当我写问题的时候,我忘记了这个细节。我不能让它工作。对于Linq来说,它是在抱怨最后一行“…Products());”。我用“产品”代替了它。但还是不行。Lambda语句总是返回空结果。@CraigStuntz:在您的评论之前和看到您的答案之前,我已经编辑过:)(我意识到我们的答案非常相似,但我保留了我的答案作为替代,因为我相信这里的方法符号更干净-查询表达式只是增加了噪音。还有检查生成的SQL的建议。)Any()
被翻译(无论如何,由SQL Server提供商翻译)由于的存在
,这将产生一个合理的执行计划。@CraigStuntz:这当然是我希望的。我可能还是会检查一下:)谢谢你们。请看我的编辑上面。忘了一个小细节。如果我想列出未按ID=1的顺序订购的产品,该怎么办?当我写问题的时候,我忘记了这个细节。我不能让它工作。对于Linq来说,它是在抱怨最后一行“…Products());”。我用“产品”代替了它。但还是不行。Lambda语句始终返回空结果。谢谢。这是有用的。请看我的编辑上面。忘了一个小细节。如果我想列出未按ID=1的顺序订购的产品,该怎么办?谢谢。这是有用的。请看我的编辑上面。忘了一个小细节。如果我想列出未按ID=1的顺序订购的产品,该怎么办?
var q = from p in Context.Products
where !p.Orders.Any()
select p;
var q = from p in Context.Products
where !p.Orders.Any(o => o.Id == 1)
select p;