Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架:多个源正在生成交叉连接_C#_Sql Server_Entity Framework_Linq - Fatal编程技术网

C# 实体框架:多个源正在生成交叉连接

C# 实体框架:多个源正在生成交叉连接,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我是实体框架的新手,我正在处理一个查询并找到了一个解决方案,但是在使用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查询

我是实体框架的新手,我正在处理一个查询并找到了一个解决方案,但是在使用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
注意交叉连接。 据我所知,使用交叉连接不是一个好主意。 它为什么这样做


如果您像这样映射多对多关系,是否还有其他语法可以用于获得相同的结果(按信用卡类型计算人数)

class Person{
 ..more properties here

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

class CreditCard{
 ..more properties here

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

更改所用内容的上下文。

尝试通过
PersonCreditCard
启动查询:

var query= context.PersonCreditCard.GroupBy(c=>c.CreditCard.CardType)
                                   .Select(g=>new {
                                                    cname = g.Key,
                                                    cptPerson = g.Count()
                                                  }
                                          );
更新 我猜在
PersonCreditCard
实体中,您也有一个对
人的引用,因此您可以向查询添加
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);
                                                  }
                                          );

不,问题是个人和信用卡之间存在多对多的关系。因此,中间有一个表PersonCreditCard。所以信用卡的类型是信用卡,而不是个人信用卡。我不能做p.PersonCreditCard.CreditCard.CardType。您的代码中有实体映射该关系吗?或者你只是有个人实体上的信用卡列表和信用卡上的个人列表?我使用的真正的数据库是AdventureWorks 2014(MS demo db)。然后我使用“实体数据模型向导”导入“代码优先于数据库”。所以简单的回答是:是的,我有一个实体来映射个人和信用卡之间的关系,它叫做PersonCreditCard。所以你的答案不起作用。是的,它给出了正确的数字。。。但它并没有完全回答这个问题。您通过删除Person表来解决此问题。我同意计算关系表中的条目数将得到与计算人员相同的结果。。。但是如果我想数一数名为约翰的人。。。如何将其添加到该查询中?好的,我的第一个查询是基于您希望使用查询得到的结果;)。检查我的更新,在那里我添加了你在评论中提到的条件好的,我重新检查我刚才说的。您可以添加一个.where,它可以使用Person属性。让我想想。。。也许你已经知道答案了。我已经添加了另一个更新,请告诉我这是否是你想要的。更新2很有趣。。。但更新1是我一直在寻找的(目前:))。在更新2中,我了解到它返回按组计数的人。因此,为每个小组提供一份人员列表(有助于深入了解)会很有趣。但这对我想做的事来说太过分了。一句话:实体框架不是SQL:)为了能够使用EF,我必须放弃我在SQL中所知道的大部分内容。如果您包括Person和PersonCreditCard的模型,这将非常有用。我想这可能是一对多的关系,但我不喜欢假设。如果是,那么您的映射可能是关闭的,这肯定可以解释它,因为EF不知道这两个实体在DB模型中是如何关联的。
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);
                                                  }
                                          );