【问题标题】:LINQ to SQL Select Distinct by Multiple Columns and return entire entityLINQ to SQL 按多列选择不同并返回整个实体
【发布时间】:2011-09-09 15:58:28
【问题描述】:

我正在使用第三方数据库,需要为我正在研究的特定市场选择一组不同的数据。每个市场的数据都是相同的,因此将其全部提取出来是多余的,而且我不想围绕它硬编码任何逻辑,因为我们正在与供应商合作解决问题,但我们需要一个能够解决的问题与供应商合作修复以及数据库当前的方式,因为在他们的修复上线之前可能需要一段时间。

我不想按任何东西分组,因为我想在最低级别获取数据,但我不想要任何冗余数据。我当前的查询看起来与此类似...

determinantData = (from x in dbContext.Datas
                   where x.Bar.Name.Equals(barName) &&
                         x.Something.Name.Equals(someName) &&
                         FooIds.Contains(x.Foo.Id) &&
                         x.Date >= startDate && 
                         x.Date <= endDate
                   select x).Distinct();

这并没有达到我的预期。我想通过三个属性选择不同的记录,比如FooBarSomething,但返回整个对象。如何使用 LINQ 做到这一点?

【问题讨论】:

  • 这种“我不想按任何东西分组,因为我想在最低级别获取数据,但我不想要任何冗余数据”没有意义。选择 distinct 和 group by 做同样的事情,但如果你分组,你也可以在选择列表中拥有聚合函数。
  • 我意识到这一点,我只是不知道如何以更好的方式问它.. 基本上我不想聚合不属于区别的其他数据,但我仍然想要选择该数据。

标签: c# .net linq linq-to-sql linq-to-entities


【解决方案1】:

您可以将group by 与您想要区分的属性一起使用,然后选择每个组的第一项:

determinantData = (from x in dbContext.Datas
                   where x.Bar.Name.Equals(barName) &&
                         x.Something.Name.Equals(someName) &&
                         FooIds.Contains(x.Foo.Id) &&
                         x.Date >= startDate && 
                         x.Date <= endDate
                   group x by new { x.Foo, x.Bar, x.Something } into market 
                   select market).Select( g=> g.First()); 

【讨论】:

  • 虽然这有效,但它极大地影响了报告生成的性能。该报告通常会在十秒内生成,现在需要一分钟多的时间。为解决方案 +1,但有什么方法可以解决性能问题?
  • 实际上,在运行了几次测试之后,生成报告的时间接近 3 分钟。
  • @shuniar:另一种方法是使用AsEnumerable() 在内存中对匹配的数据进行分组。然后你也可以使用 MoreLinq 项目中的DistinctBycode.google.com/p/morelinq/source/browse/trunk/MoreLinq/…
  • 我最终使用了 MoreLinq 的 DistinctBy 方法,它加快了我的查询速度。我不得不在调用之前ToList() 我的数据,因为我遇到了“另一个数据读取器已经关联......”异常。但是,仍然比最初快得多。标记为答案,谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多