Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写Linq(或lambda)语句来生成所有不在(或不存在)中的元素_Linq_Entity Framework_Lambda_Not Exists - Fatal编程技术网

如何编写Linq(或lambda)语句来生成所有不在(或不存在)中的元素

如何编写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

以下是我的方案(表):

我想你有主意了。这里没有什么不寻常的

导入到EDMX文件OrderProductXREF时,表格是不可见的实体。我看到的只是导航属性:产品用于实体订单订单用于实体产品

所以,我的问题是: 我需要Linq和/或Lambda语句,该语句将列出所有没有与任何订单关联的产品。或者,列出从未订购过的所有产品。

SQL应该是这样的:

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;