【发布时间】:2017-04-12 04:10:31
【问题描述】:
我在尝试将 SQL 查询转换为 LINQ 时遇到问题。 假设,我们有如下数据结构:
class Movie
{
public Guid ID { get; set; }
// navigation properties
public virtual ICollection<Commercial> Commercials { get; set; }
public virtual ICollection<Spectator> Spectators { get; set; }
}
class Commercial
{
public Guid ID { get; set; }
public Guid MovieID { get; set; }
public string ProductType { get; set; }
// navigation property
public virtual Movie Movie { get; set; }
}
class Spectator
{
public Guid ID { get; set; }
public Guid MovieID { get; set; }
public int Age { get; set; }
// navigation property
public virtual Movie Movie { get; set; }
}
现在假设,我想知道有多少观众看到了某个产品类别的广告。在 SQL 中,它看起来像这样:
select Commercial.ProductType, count(distinct Spectator.ID)
from Spectator
join Movie on Spectator.MovieID = Movie.ID
join Commercial on Commercial.MovieID = Movie.ID
where Spectator.Age > 60 # optional filter
group by Commercial.ProductType;
首先,我尝试使用GroupBy()函数,但由于多对多关系,我没有找到按广告产品类型对观众进行分组的方法。
然后我尝试了类似的东西:
var query = db.Commercials.Where(x => x.Age > 60).GroupJoin(
db.Spectators,
c => c.MovieID,
s => s.MovieID,
(c, g) => new { ProductType = c.ProductType, Count = g.Distinct().Count() });
这看起来很有希望,但没有返回预期的结果。
【问题讨论】:
-
对不起。我的第一个示例过于简单,甚至与我实际遇到的问题不匹配。我希望我的新示例包含所需的所有相关信息。
标签: c# sql-server linq group-by