简体   繁体   English

在LINQ中按和MIN()分组

[英]Group by and MIN() in LINQ

Trying to convert the below SQL query to LINQ, but I'm stuck at grouping by ClientCompany. 尝试将下面的SQL查询转换为LINQ,但是我只能按ClientCompany分组。

SELECT TOP 300 ClientCompany,
CASE WHEN MIN(FeatureID) = 12 THEN 1 ELSE 0 END as Sort
FROM Ad
LEFT JOIN AdFeature
ON Ad.ID = AdFeature.AdID
WHERE (AdFeature.FeatureID = 13 OR AdFeature.FeatureID = 12)
AND SiteID = 2
GROUP BY ClientCompany
ORDER BY Sort DESC

My attempt to convert this to LINQ: 我试图将其转换为LINQ:

(from a in Ads
join af in AdFeatures
on new {
join1 = a.ID,
join3 = 2
} equals new {
join1 = af.AdID,
join3 = af.SiteID
}
let sort = (
af.FeatureID == 12 ? 1 : 0
)
orderby sort descending
where af.FeatureID == 13 || af.FeatureID == 12
select new { a.ClientCompany, sort } ).Take(300)

How would I use MIN(FeatureID) and GROUP BY ClientCompany in LINQ, so that I only get a single row per ClientCompany back? 我将如何在LINQ中使用MIN(FeatureID)GROUP BY ClientCompany ,以便每个ClientCompany仅返回一行?

EDIT 编辑

This worked! 这工作了! Based on Daniel Hilgarth's answer. 基于Daniel Hilgarth的回答。 Is there anything that can go horribly wrong with this solution? 此解决方案有什么地方可能会发生严重错误吗?

Ads.Join(AdFeatures, x => x.ID, x => x.AdID,
(a, af) => new { Ad = a, AdFeature = af })
.Where(x => x.AdFeature.FeatureID == 12 || x.AdFeature.FeatureID == 13)
.Where(x => x.AdFeature.SiteID == 2)
.GroupBy(x => x.Ad.ClientCompany)
.Select(g => new { ClientCompany = g.Key, Sort = g.Min(x => x.AdFeature.FeatureID) == 12 ? 1 : 0 })
.OrderByDescending(x => x.Sort)
.Take(300)

Try this: 尝试这个:

Ads.Join(AdFeatures, x => x.FeatureID, x => x.FeatureID,
         (a, af) => new { Ad = a, AdFeature = af })
   .Where(x => x.AdFeature.FeatureID == 12 || x.AdFeature.FeatureID == 13)
   .Where(x => x.AdFeature.SiteID == 2)
   .GroupBy(x => x.Ad.ClientCompany)
   .Select(g => new { ClientCompany = g.Key,
                      Sort = g.Min(x => x.AdFeature.FeatureID) == 12 ? 1 : 0 });

Please note, I changed the left outer join into an inner join, because your original query accesses AdFeature unconditionally, making it effectively an inner join . 请注意,我将左外部AdFeature更改为内部AdFeature ,因为您的原始查询无条件访问AdFeature ,从而有效地将其作为内部AdFeature

Try this: 尝试这个:

(from a in ads
 join af in AdFeatures on a.ID equals af.AdID into g
 from x in g.DefaultIfEmpty()
 where x.FeatureID == 13 || x.FeatureID == 12
 where x.SiteID == 2
 orderby a.Sort descending
 group a by a.ClientCompany into g2
 from x2 in g2
 let sort = g2.Select(T => T.FeatureID).Min() == 12 ? 1 : 0
 select new { a.ClientCompany, Sort = sort }).Take(300);

Why do you need grouping anyway? 为什么仍然需要分组?

hi I would write it like that 嗨,我会这样写

            context.Ads.Where(ad => ad.AdFeatures.Any(feature => (feature.FeatureID == 13 || feature.FeatureID == 12) && feature.SiteID == 2))
                   .GroupBy(ad => ad.ClientCompany)
                   .Select(ads => new
                   {
                       cc = ads.Key, sort = ads.SelectMany(ad => ad.AdFeatures)
                                               .Select(feature => feature.FeatureID)
                                               .Min() == 12
                   })
                   .OrderBy(arg => arg.sort).Take(300);

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

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