【问题标题】:How to combine collection of linq queries into a single sql request如何将 linq 查询的集合组合成一个 sql 请求
【发布时间】:2013-08-05 15:56:16
【问题描述】:

感谢您查看此内容。

我的情况是我有一个系统,用户可以在其中创建自定义过滤视图,我将其构建到请求的 linq 查询中。在界面上,他们想查看他们创建的所有视图的计数;很直接。我熟悉将多个查询组合到一个调用中,但在这种情况下,我不知道我最初有多少查询。

有谁知道这种循环将计数查询组合成一个查询的技术,然后我可以使用 ToList() 或 FirstOrDefault() 执行该查询?

//TODO Performance this isn't good...
foreach (IMeetingViewDetail view in currentViews)
{
    view.RecordCount = GetViewSpecificQuery(view.CustomFilters).Count();
}

这是我所指的多个查询组合的示例。这是两个查询,然后我将它们组合成一个匿名投影,从而产生对 sql 服务器的单个请求。

 IQueryable<EventType> eventTypes = _eventTypeService.GetRecords().AreActive<EventType>();
            IQueryable<EventPreferredSetup> preferredSetupTypes = _eventPreferredSetupService.GetRecords().AreActive<EventPreferredSetup>();

            var options = someBaseQuery.Select(x => new
                {
                    EventTypes = eventTypes.AsEnumerable(),
                    PreferredSetupTypes = preferredSetupTypes.AsEnumerable()
                }).FirstOrDefault();

【问题讨论】:

  • “合并”是什么意思?
  • 我的意思是结合 IQueryables。假设我从查询中取出了 Count(),那么我将只有一个 IQueryable,然后我可以将其组合成一个投影,从而产生一个查询。在这种情况下,我不知道最终会得到多少可查询,因为它是每个用户创建的记录。
  • 你最终会得到 一个。 IQueryable 是懒惰的;您可以链接 IQueryables,并且组合的 Linq 语句将不会执行,直到您通过调用 Count 或 ToList 之类的东西来强制它提供输出。链接 IQueryables 会创建一个执行管道。见blogs.msdn.com/b/charlie/archive/2007/12/09/…
  • 不,每次计数我都会得到一个查询。我在问题中添加了一个示例。
  • 是的,我就是这么说的。 Count() 强制执行处理管道。

标签: linq linq-to-entities entity-framework-5


【解决方案1】:

好吧,出于性能考虑,我会将接口从 IEnumerable&lt;T&gt; 更改为具有 Count 属性的集合。 IList&lt;T&gt;ICollection&lt;T&gt; 都具有 count 属性。 这样,集合对象就可以跟踪它的大小,您只需要读取它。

如果你真的想避免循环,你可以将 RecordCount 重新定义为一个延迟加载的整数,它调用 GetViewSpecificQuery 来获取一次计数。

private int? _recordCount = null;
public int RecordCount 
{
    get 
    {
         if (_recordCount == null)
             _recordCount = GetViewSpecificQuery(view.CustomFilters).Count;
         return _recordCount.Value;
    }
 }

【讨论】:

  • 这不会改变任何东西。我仍然有多个用户视图来获取计数,延迟加载它们仍然是每个计数的 sql 请求。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2015-10-08
  • 2012-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多