【问题标题】:A better way to do this LINQ query?执行此 LINQ 查询的更好方法?
【发布时间】:2009-12-05 21:39:52
【问题描述】:

我有一些不能直接相互访问的数据对象集合。我想最好的解决方案是让数据库人员对此进行查询,但与此同时,有什么办法可以收紧吗?

var conflicting = allFoos.Where(foo => foo.ElectronicSerialNumber != 0 
                                && foo.BarID != interestingBar.ID)
                    .Join(fooInfoCollection, foo => foo.ElectronicSerialNumber, 
                                             fooInfo => fooInfo.ElectronicID, 
                                             (foo, fooInfo) => foo)
                    .Join(allBars, foo => foo.BarID, bar => bar.ID, (foo, bar) => bar)
                    .Where(bar => bar.SomeCriteria == false)
                    .FirstOrDefault();
if (conflicting != null)
{
   doStuff(conflicting);
}               

【问题讨论】:

  • 您能否澄清一下这是 LINQ to SQL 还是 LINQ to Objects?另外,您是否有连接的外键约束?
  • linq 到对象,没有我知道的限制
  • 澄清问题:“收紧”可能意味着很多事情。您是指风格、性能还是其他?
  • 如果您只是指语法,有时如果您使用中间变量名称,则在编写查询时更容易阅读/理解查询。请记住,在您枚举之前,不会评估任何 IQueryable。
  • @David B:性能,如果可能的话,或者更惯用的方式,或者你有什么。基本上,它的某些东西让我觉得不太对劲。但到目前为止,除了数据库推荐(我预料到的),我还没有看到有人说“你做错了”,所以也许这种“健全性检查”就足够了。

标签: c# linq c#-3.0 linq-to-objects


【解决方案1】:

看起来您已经从数据库中获取了所有 Foos、所有 FooInfos 和所有 Bars,因此您可以在实际上只需要一个 Bar 对象作为结果的情况下进行查询。如果您必须为另一个查询从数据库中取出所有这些对象,那么这没关系,但如果您只为这个查询获得所有这些对象,那么这是非常低效的。您应该尝试让数据库执行查询,并且只返回您需要的一个对象。

即使没有外键约束,您仍然可以进行连接,并且您可以在 Linq To SQL 中的类型之间进行set up relationships,即使它们实际上并不存在于数据库中,这样可以更轻松地制定查询。

【讨论】:

    【解决方案2】:

    很难从风格上接受 Lambda 语法 使用的连接。 查询理解语法有更好的连接方式。执行相同的操作。

    Bar conflicting = 
    (
      from foo in allFoos
      where foo.ElectronicSerialNumber != 0
      where foo.BarID != interestingBar.ID
      join fooInfo in fooInfoCollection
      on foo.ElectronicSerialNumber equals fooInfo.ElectronicID
      join bar in allBars
      on foo.BarID equals bar.ID
      where !bar.SomeCriteria
      select bar
    ).FirstOrDefault();
    

    注意,如果您想使用 foo 和 fooInfo(和 bar),则它们在 select 子句的范围内。

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多