繁体   English   中英

实体框架:多个来自正在生成交叉连接

[英]Entity Framework: multiple from is generating cross join

我是实体框架的新手,我正在处理一个查询并找到了一个解决方案,但是在使用 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);
                                                  }
                                          );

如果你像这样映射你的多对多关系

class Person{
 ..more properties here

  public virtual ICollection<CreditCard> CreditCards{ get; set; }
}

class CreditCard{
 ..more properties here

  public virtual ICollection<Person> Persons{ get; set; }
}

您可以像这样进行查询

int count = _context.Persons.GroupBy(p => p.CreditCards.Select(c=>c.CardType)).Count();

更改您正在使用的任何内容的 _context。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM