【问题标题】:Multiple counts on single table in LINQ queryLINQ查询中单个表的多次计数
【发布时间】:2013-06-03 16:23:21
【问题描述】:

我在 LINQ 查询中对单个表进行多次计数时遇到问题。我正在使用 NHibernate、LINQ to NHibernate 和 C#。

query 是一个填充列表。我有一个表,它有一个名为 FullRef 的布尔值。我想做一个 LINQ 查询来计算每个 TrackId 上 FullRef = false 和 FullRef = true 的出现次数。每次获得 track.Source == "UserRef" 时,TrackId 都会获得一个新行。

在以下查询中,我得到了 FullRef = true 的正确数字计数(来自 FullRefTrueCount),但它在 FullRefFalseCount 上给出了一个未知的错误数字。

var query2 = from track in query
    where track.Source == "UserRef"
    group track by new { TrackId = track.TrackId, FullRef = track.FullRef } into d

    select new FullReferrer
    {
        Customer = d.Key.TrackId,
        FullRefFalseCount = d.Where(x => x.FullRef == false).Count(),
        FullRefTrueCount = d.Where(x => x.FullRef == true).Count()
    };

我还尝试将其修改为在 group by 中不包含 FullRef。这是通过像这样在 by 上删除 FullRef = track.FullRef 来完成的

var query2 = from track in query
    where track.Source == "UserRef"
    group track by new { TrackId = track.TrackId } into d

    select new FullReferrer
    {
        Customer = d.Key.TrackId,
        FullRefFalseCount = d.Where(x => x.FullRef == false).Count(),
        FullRefTrueCount = d.Where(x => x.FullRef == true).Count()
    };

现在它给了我 TrackId 的总数,忽略了我的 .Where(x => x.FullRef == true/false) 语句。

有人知道如何解决它吗? 我想这是问题所在的“分组依据”。我可以以某种方式避免分组吗? 我可能需要加入吗?

【问题讨论】:

    标签: c# sql linq nhibernate


    【解决方案1】:

    尝试计数(条件)。

        FullRefFalseCount = d.Count(x => x.FullRef == false),
        FullRefTrueCount = d.Count(x => x.FullRef == true)
    

    【讨论】:

    • 对不起,这对我不起作用。然后查询根本没有给出任何结果(“枚举没有结果”)
    【解决方案2】:
    FullRefFalseCount = d.Where(x => x.FullRef == false).ToList().Count
    FullRefTrueCount = d.Where(x => x.FullRef == true).ToList().Count
    

    试试这个

    【讨论】:

    • 这也不起作用。假设您的意思是 .Count() 而不是 .Count。
    【解决方案3】:

    试试这个。这会从数据表中获取预期数据。

    string source = "UserRef";
    var result = from row in dt.AsEnumerable()
                 where row["source"].Equals(source)
                 group row by row["TrackId"]
                 into g
                 select new
                    {
                       TrackId = g.Key,
                       FullRefTrueCount = ((from track in g where track["FullRef"].Equals("true") select track).Count()),
                       FullRefFalseCount = ((from track in g where track["FullRef"].Equals("false") select track).Count())
                    };
    

    【讨论】:

    • 不幸的是,这给出了完全相同的问题
    【解决方案4】:

    对于 NHibernate 我不知道,但是使用带有实体框架的 Linq 这应该得到你想要的:

    var query2 = (
        from track in someDbSet
        select new FullReferrer
        {
              Customer = track.trackId
            , FullRefFalseCount = (from fullRefFalse in someDbSet.tracks
                                   where fullRefFalse.IsSale == false 
                                   && fullRefFalse.trackId == track.trackId
                                   select fullRefFalse).Count()
            , FullRefTrueCount = (from fullRefTrue in someDbSet.tracks
                                  where fullRefTrue.IsSale == true
                                  && fullRefTrue.trackId == track.trackId
                                  select fullRefTrue).Count()
        }
    ).Distinct();
    

    【讨论】:

      【解决方案5】:

      对于遇到类似问题的其他人,我通过将其设为“.AsEnumerable()”解决了它

      var query2 = from track in query.AsEnumerable() // <--- the solution
          where track.Source == "UserRef"
          group track by new { TrackId = track.TrackId } into d
      
          select new FullReferrer
          {
              Customer = d.Key.TrackId,
              FullRefFalseCount = d.Count(x => !x.FullRef),
              FullRefTrueCount = d.Count(x => !x.FullRef)
          };
      

      【讨论】:

      • 这个会转化成单条sql查询吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2019-02-04
      相关资源
      最近更新 更多