如何将linq查询集合合并到单个sql请求中

如何将linq查询集合合并到单个sql请求中,linq,linq-to-entities,entity-framework-5,Linq,Linq To Entities,Entity Framework 5,谢谢你检查这个 我的情况是,我有一个系统,在这个系统中,用户可以创建自定义的过滤视图,我根据请求将这些视图构建到linq查询中。在界面上,他们希望看到他们创建的所有视图的计数;非常直截了当。我熟悉将多个查询合并到一个调用中,但在这种情况下,我不知道最初有多少个查询 有人知道这样一种技术吗?这个循环将count查询组合成一个查询,然后我可以使用ToList()或FirstOrDefault()执行该查询 下面是我所指的多个查询组合的示例。这是两个查询,然后我将它们组合成一个匿名投影,从而生成对sq

谢谢你检查这个

我的情况是,我有一个系统,在这个系统中,用户可以创建自定义的过滤视图,我根据请求将这些视图构建到linq查询中。在界面上,他们希望看到他们创建的所有视图的计数;非常直截了当。我熟悉将多个查询合并到一个调用中,但在这种情况下,我不知道最初有多少个查询

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

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

 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();
IQueryable eventTypes=\u eventTypeService.GetRecords().AreaActive();
IQueryable preferredSetupTypes=\u eventPreferredSetupService.GetRecords().AreaActive();
var options=someBaseQuery.Select(x=>new
{
EventTypes=EventTypes.AsEnumerable(),
PreferredSetupTypes=PreferredSetupTypes.AsEnumerable()
}).FirstOrDefault();

出于性能考虑,我将把接口从
IEnumerable
更改为具有Count属性的集合。
IList
ICollection
都有count属性。 这样,集合对象将跟踪其大小,您只需读取它

如果确实希望避免循环,可以将RecordCount重新定义为一个延迟加载的整数,该整数调用GetViewSpecificQuery获取一次计数

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

你说的“联合”是什么意思?我指的是联合液体燃料。假设我去掉了查询中的Count(),那么我只需要一个IQueryable,然后我可以将它组合成一个投影,从而生成一个查询。在这种情况下,我不知道最终会有多少个查询项,因为每个用户创建的记录都有一个查询项,而您最终会有一个查询项。IQueryable是懒惰的;您可以链接IQueryables,并且组合的Linq语句将不会执行,除非您通过调用Count或ToList之类的命令强制它提供输出。链接IQueryables将创建一个执行管道。看不,我最终得到了一个查询每计数。我在问题上加了一个例子。是的,我就是这么说的
Count()
强制执行处理管道。这不会改变任何事情。我仍然有多个用户视图需要获得计数,延迟加载它们仍然是每个计数的sql请求。
private int? _recordCount = null;
public int RecordCount 
{
    get 
    {
         if (_recordCount == null)
             _recordCount = GetViewSpecificQuery(view.CustomFilters).Count;
         return _recordCount.Value;
    }
 }