尝试将以下SQL查询转换为LINQ,但我坚持由ClientCompany进行分组。LINQ中的分组和MIN()
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)
我将如何使用MIN(FeatureID)
和GROUP BY ClientCompany
在LINQ,所以我只有每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)
所有答案都包含我不习惯的lambda表达式。你能解释一下这里发生了什么吗? 当我用LINQPad 4试用时,它不工作。 _'LINQPad.User.Ad'不包含'FeatureID'的定义,也没有接受'LINQPad'类型的第一个参数的扩展方法'FeatureID' .User.Ad'可以找到(按F4添加使用指令或程序集引用)_ –
使用了一些修改(在原始文章中更新)。谢谢! –