Linq To实体,从选择中选择

时间:2014-03-11 22:50:08

标签: c# linq linq-to-entities

我现在已经尝试了总和时间,但是我无法在LINQ to Entites中做出这样的选择吗?如何选择选择

SELECT * FROM tProduct AS tpp, tProductGroupDetail AS tppg,
    (SELECT tpgd.ProductGroupID AS pgID 
     FROM tProduct AS tp, tProductGroupDetail AS tpgd
     WHERE tp.ProductID = 428 AND tpgd.ProductID = tp.ProductID) AS JoinedTable
WHERE JoinedTable.pgID = tppg.ProductGroupID
      AND tpp.ProductID = tppg.ProductGroupID

3 个答案:

答案 0 :(得分:3)

您的SQL语句非常奇怪。是不是等同于以下陈述?

SELECT *
FROM
    tProduct AS p
    INNER JOIN tProductGroupDetail AS pgd
        ON p.ProductID = pgd.ProductGroupID
WHERE
    pgd.ProductID = 428

相应的LINQ查询将非常明显。


让我们一步一步地改变你的SQL:

嵌套的SELECT看起来像这样:

 
(SELECT tpgd.ProductGroupID AS pgID 
FROM tProduct AS tp, tProductGroupDetail AS tpgd
WHERE tp.ProductID = 428 AND tpgd.ProductID = tp.ProductID)

这与

相同  
(SELECT tpgd.ProductGroupID AS pgID 
FROM tProductGroupDetail AS tpgd
WHERE tpgd.ProductID = 428)

tpgd.ProductID = tp.ProductID起,您可以直接测试tpgd.ProductID = 428,而无需加入tp。简单的声明现在看起来像这样:

SELECT * FROM tProduct AS tpp, tProductGroupDetail AS tppg,
    (SELECT ProductGroupID
     FROM tProductGroupDetail
     WHERE ProductID = 428) AS JoinedTable
WHERE JoinedTable.ProductGroupID = tppg.ProductGroupID
      AND tpp.ProductID = tppg.ProductGroupID

基本上,它的作用是将tProduct加入tProductGroupDetail。与JoinedTable进行额外加入的目的是将记录限制为仅包含ProductID = 428的产品组。这种情况可以直接应用:

SELECT *
FROM tProduct AS tpp, tProductGroupDetail AS tppg,
WHERE tppg.ProductID = 428 -- Note: ProductID of tggp, NOT tpp!
     AND tpp.ProductID = tppg.ProductGroupID

最后一步是用INNER JOIN子句替换连接并调整别名。这产生了我的第一个SQL语句。

答案 1 :(得分:1)

要获取包含产品#428的ProductGroup列表,请写下:

dataContext.Products.FirstOrDefault(p => p.ProductID == 428).ProductGroups

此解决方案假定导航属性Product的实体ProductGroups中存在。如果不是这种情况,感谢您指定实体模型。

答案 2 :(得分:0)

我认为应该这样做(虽然它不是我的头脑,没有经过测试):

var product = Products.Where(x => x.ProductGroup.Any(y => y.ProductID == 428));