我现在已经尝试了总和时间,但是我无法在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
答案 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));