c# - Entity Framework : multiple from is generating cross join

标签 c# sql-server entity-framework linq

我是 Entity Framework 的新手,我正在处理查询并找到了解决方案,但在使用 LINQPad 进行一些调查后,我不喜欢生成的 SQL。

Linq 查询是:

from p in Person
from pcc in p.PersonCreditCard
group p by new { pcc.CreditCard.CardType } into g
select new
{
     cname = g.Key.CardType,
     cptPerson = g.Count()
}

生成的sql查询是

SELECT COUNT(*) AS [cptPerson], [t2].[CardType] AS [cname]
FROM [Person].[Person] AS [t0]
CROSS JOIN [Sales].[PersonCreditCard] AS [t1]
INNER JOIN [Sales].[CreditCard] AS [t2] ON [t2].[CreditCardID] = [t1].[CreditCardID]
WHERE [t1].[BusinessEntityID] = [t0].[BusinessEntityID]
GROUP BY [t2].[CardType

注意交叉连接。 据我所知,使用 CROSS JOIN 并不是一个好主意。 为什么会这样?

我可以使用另一种语法来获得相同的结果(按信用卡类型计算人数)

最佳答案

尝试通过 PersonCreditCard 开始查询:

var query= context.PersonCreditCard.GroupBy(c=>c.CreditCard.CardType)
                                   .Select(g=>new {
                                                    cname = g.Key,
                                                    cptPerson = g.Count()
                                                  }
                                          );

更新

我想在 PersonCreditCard 实体中你也有一个对 Person 的引用,所以你可以像这样向你的查询添加一个 Where 调用:

var query= context.PersonCreditCard.Where(pc=>pc.Person.Name=="John")
                                   .GroupBy(c=>c.CreditCard.CardType)
                                   .Select(g=>new {
                                                    cname = g.Key,
                                                    cptPerson = g.Count()
                                                  }
                                          );

更新2

我想我明白你的意思了,如果你想在结果中包含属于每个组的人,你可以执行以下操作:

var query= context.PersonCreditCard.Where(pc=>pc.Person.Name=="John")
                                   .GroupBy(c=>c.CreditCard.CardType)
                                   .Select(g=>new {
                                                    cname = g.Key,
                                                    cptPerson = g.Count()
                                                    people=g.Select(pc=>pc.Person);
                                                  }
                                          );

关于c# - Entity Framework : multiple from is generating cross join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192508/

相关文章:

c# - 以编程方式安装 Windows 服务

c# - 在C#中使用NAudio将M4A音频文件转换为MP3时出现问题/错误

sql - 按别名分组

c# - 如何处理 EF Core 上的并发

c# - Binding.SourceUpdated 未触发

sql-server - 在 SQL Server 2005 中查询 XML 列

sql-server - 在 tempdb 中找不到对象

wpf - LINQ to Entities 异常(ElementAtOrDefault 和 CompareObjectEqual)

c# - 选择 Entity Framework 中另一个表中不存在的记录

c# - 使用 SQL_VARIANT 的 Entity Framework