C# SQL左外部联接、groupby&;orderby到LINQ方法查询或方法语法
其主要目的是根据受欢迎程度(即有多少人喜欢某一特定配料)按排序顺序返回配料列表。SQL等价物如下所示:C# SQL左外部联接、groupby&;orderby到LINQ方法查询或方法语法,c#,sql,linq,entity-framework,join,C#,Sql,Linq,Entity Framework,Join,其主要目的是根据受欢迎程度(即有多少人喜欢某一特定配料)按排序顺序返回配料列表。SQL等价物如下所示: select distinct COUNT(PersonalInfoes.FavoriteIngredient_ID) as NoUsing, Ingredients.Name from PersonalInfoes right join Ingredients on PersonalInfoes.FavoriteIngredient_ID = Ingredients.ID group
select distinct COUNT(PersonalInfoes.FavoriteIngredient_ID) as NoUsing,
Ingredients.Name
from PersonalInfoes right join Ingredients
on PersonalInfoes.FavoriteIngredient_ID = Ingredients.ID
group by Ingredients.Name
order by NoUsing desc
方法语法的等效SQL查询将产生与上述相同的结果是什么?
我得到的最接近的结果是:
from i in db.Ingredients
join p in db.PersonalInfos on i.ID equals p.FavoriteIngredient.ID into ing
from p in ing.DefaultIfEmpty()
group i by i.Name into g
from p in g
orderby g.Count() descending
select new { Name = g.Key, Count = g.Count() }.Name;
您的查询执行左外联接,以包括没有收藏夹的成分。问题是,对于没有收藏夹的每个成分,您正在计算DefaultIfEmpty()生成的单个值。按如下方式计数时,可以排除默认值:
orderby g.Count(x=>x!=null)递减
实际上,您不必执行左连接。您只需将组加入的组数相加即可:
from i in db.Ingredients
join p in db.PersonalInfos on i.ID equals p.FavoriteIngredient.ID into faves
group faves.Count() by i.Name into faveCounts
let count = faveCounts.Sum()
orderby count descending
select new { Name = faveCounts.Key, Count = count };
代码的一个主观问题是,它与所有group by
和from
子句非常混淆。如果您发现这是一个问题,您可以尝试使用更多描述性名称、子查询或方法语法
编辑:这里是一个方法语法版本。这不是查询语法版本的直接转换,因为这会非常难看
db.Ingredients
.GroupJoin(db.PersonalInfos,
i => i.ID,
p => p.ID,
(i, g) => new { i.Name, FaveCount = g.Count() })
.GroupBy(x => x.Name,
(key, grp) => new { Name = key, Count = grp.Sum(y => y.FaveCount) })
.OrderByDescending(x => x.Count);
这段代码还有什么问题?它仍然不起作用,不能根据使用每个InCredition的人数进行排序。如果不访问存在问题的数据库,我将很难提供帮助(也许其他人可以编写没有它的LINQ,但我不能)。有没有一种方法可以将问题隔离成我们可以在任何系统上运行的东西?数据只来自两个表。1个表被称为PersonalInfo,其中包含ff字段:字符串Firstname、字符串Lastname、datetime Birthdate、int-ID、字符串email、配料Favorite配料。Favorite Component是Component类型的复杂数据类型。Component对应于另一个表:Component w/ff字段:string Name和int IDI understand。谢谢,Martin。顺便说一句,你能给我上面的解决方案的方法语法吗?顺便说一句,这里有p=>p.id(personalinfo行),但是接下来的一行怎么会变成g.count,g代表什么?选择特定配料的人数?你是怎么说你想计算最喜欢的配料字段的?@Nizzy:
p=>p.ID
用于选择要加入的PersonalInfo的哪个字段,而g有让组加入配料i的PersonalInfos。