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