0

试图将下面的 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

我尝试将其转换为 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)

我将如何在 LINQ 中使用MIN(FeatureID)GROUP BY ClientCompany,以便每个 ClientCompany 只返回一行?

编辑

这行得通!基于 Daniel Hilgarth 的回答。这个解决方案有什么可能会出错的地方吗?

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

3 回答 3

4

试试这个:

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

请注意,我将左外连接更改为内连接,因为您的原始查询AdFeature无条件访问,使其有效地成为内连接。

于 2013-10-17T10:42:56.913 回答
0

试试这个:

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

为什么还需要分组?

于 2013-10-17T10:34:26.207 回答
0

嗨,我会这样写

            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);
于 2013-10-17T10:36:32.847 回答