【问题标题】:LINQ FirstOrDefault problemLINQ FirstOrDefault 问题
【发布时间】:2011-02-08 09:37:03
【问题描述】:

我卡在 LINQ 查询上。基本上,我有两个通过唯一ID 键关联的表。一个表包含看起来重复的内容 (tblDupes),另一个是事实表 (tblVouchers)。在下面的查询中,我的“总和”正在工作,但 FirstorDefault 没有。它返回一个错误'不能隐式地将类型'string'转换为'bool'。

var dupeGroups = from d in db.tblDupes
                           group d by d.dupeGroup into g
                           select new 
                           { 
                               Group = g.Key, 
                               TotalVal = g.Sum(v => v.tblVoucher.TransactionAmtDecimal),
                               Vendor = g.FirstOrDefault(x => x.tblVoucher.vendorName)
                            };

有什么想法吗?我尝试了 FirstOrDefault 的许多不同排列,将其放在最后等等。我也尝试过 First()。

谢谢!

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    FirstOrDefault 接受谓词,表示Func<T, bool>。但是,您正在传递x => x.tblVoucher.vendorNameFunc<T, string>,因为vendorName 是一个字符串。 bool 结果表示匹配的第一行。例如,要查找vendorName 等于“foo”的第一行,您需要传入x => x.tblVoucher.vendorName == "foo"

    【讨论】:

      【解决方案2】:

      我认为 FirstOrDefault 的参数是用于过滤的谓词。您想先选择要检索的字段,然后像这样获取第一个结果(methinks):

      var dupeGroups = from d in db.tblDupes
                       group d by d.dupeGroup into g
                       select new { 
                           Group = g.Key, 
                           TotalVal = g.Sum(v => v.tblVoucher.TransactionAmtDecimal),
                           Vendor = g.Select(x => x.tblVoucher.vendorName).FirstOrDefault()
                       };
      

      希望这会有所帮助!

      【讨论】:

      • 这太完美了!我可以发誓我试过了。非常感激。我做 linq 已经有一段时间了,真的希望现在能“了解”它的更多细节 :)
      • 没问题 :) 很高兴它帮助了你! Jon Skeet 有一个 40 多岁的疯狂博客系列,讲述了他如何重新实现 LINQ to objects:msmvps.com/blogs/jon_skeet/archive/2010/09/03/… 如果你敢的话,请检查一下……它可能会为你可能模糊的一些 LINQ 语句提供一些启示。
      • 会的!我确实感觉到,即使它看起来“易于使用”,但您确实需要了解底层发生的事情的具体细节才能充分利用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 2016-03-20
      相关资源
      最近更新 更多