【问题标题】:SQL left outer join, groupby & orderby to LINQ method query or method syntaxSQL 左外连接、groupby 和 orderby 到 LINQ 方法查询或方法语法
【发布时间】:2012-12-03 23:13:56
【问题描述】:

主要目标是根据受欢迎程度(根据有多少人最喜欢的特定成分表示)返回按排序顺序排列的成分列表。 SQL 等价物如下:

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;

【问题讨论】:

  • 那段代码还有什么问题?
  • 还是不行,不是按照每种成分的使用人数排序
  • 如果无法访问您遇到问题的数据库,我将很难提供帮助(也许其他人可以在没有它的情况下编写 LINQ,但不是我)。有没有办法可以将问题隔离为我们可以在任何系统上运行的东西?
  • 数据只是来自两个表。 1 表称为 PersonalInfo 带有 ff 字段:字符串 Firstname、字符串 Lastname、datetime Birthdate、int ID、字符串电子邮件、成分最喜欢的成分。最喜欢的成分是类型成分的复杂数据类型。成分对应于 OTHER 表:成分 w/ ff 字段:字符串名称和 int ID

标签: c# sql linq entity-framework join


【解决方案1】:

您的查询执行左外连接以包含没有收藏夹的成分。问题是,对于没有收藏夹的每种成分,您都在计算 DefaultIfEmpty() 生成的单个值。您可以在这样计数时排除默认值:

orderby g.Count(x => x != null) descending

您实际上不必执行左连接。您可以将您加入的群组中的群组数量相加:

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 byfrom 子句非常混淆。如果您发现这是一个问题,您可以尝试使用更具描述性的名称、使用子查询或使用方法语法。

编辑:这是一个方法语法版本。它不是从查询语法版本的直接转换,因为那样会很丑。

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);

【讨论】:

  • 我明白了。谢谢风险马丁。
  • 顺便说一句,你能给我上面解决方案的方法语法吗?
  • 顺便说一句,这里有 p=>p.id (personalinfo 行),但是下一行怎么变成 g.count,g 代表什么?选择特定成分的人数?你怎么说你的意思是计算最喜欢的成分字段?
  • @Nizzy: p => p.ID 用于选择要加入的 PersonalInfo 的哪个字段,而 g 具有通过成分 i 加入组的 PersonalInfo。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多