gpt4 book ai didi

c# - LINQ Group by 并具有 where 子句

转载 作者:行者123 更新时间:2023-11-30 17:59:03 28 4
gpt4 key购买 nike

下面是我要翻译的 SQL 查询

SELECT dbo.Contracts.Supplier 
FROM dbo.Contracts INNER JOIN dbo.Products ON dbo.Contracts.Product = dbo.Products.Product
where dbo.Products.ProductGroup='Crude'
GROUP BY dbo.Contracts.Supplier

我是不是做错了什么,因为我没有得到与以下 LINQ 相同的结果

     var result = from c in context.Contracts
join p in context.Products on c.Product equals p.Product1
where p.Product1.Equals("Crude")
group c by c.Supplier into g
select new { supplier = g.Key };

它正在生成一个奇怪的语句

SELECT 
1 AS [C1],
[Distinct1].[Supplier] AS [Supplier]
FROM ( SELECT DISTINCT
[Extent1].[Supplier] AS [Supplier]
FROM [dbo].[Contracts] AS [Extent1]
WHERE N'Crude' = [Extent1].[Product]
) AS [Distinct1]

使用 distinct 可以,但要获得相同的结果,LINQ 应该生成这样的语句(就像忽略连接一样):

SELECT distinct dbo.Contracts.Supplier 
FROM dbo.Contracts INNER JOIN dbo.Products ON dbo.Contracts.Product = dbo.Products.Product
where dbo.Products.ProductGroup='Crude'

最佳答案

我假设您使用的是“EntityFramework”或“Linq To SQL”。如果是这样,您应该能够使用导航属性 导航到产品并过滤掉无效结果。这样您的查询可能看起来像这样:

var result = (from c in context.Contracts
where c.Products.Any(p => p.ProductGroup == "Crude")
select c.Supplier).Distinct();

它将自动转换为正确的查询(在这种情况下甚至可能没有连接,仅使用 Exists sql 关键字)并返回不同的供应商。这是如果我正确理解您的目标 - 您想要获得分配给包含来自“原油”产品组的产品的契约(Contract)的所有供应商。

基本上,当您可以使用导航时,您应该尽量避免使用 linq to sqllinq to entitiesjoin特性。系统可能会更好地将它们转换为特定的 sql

关于c# - LINQ Group by 并具有 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11577070/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com