感谢您查看此内容。
我的情况是我有一个系统,用户可以在其中创建自定义筛选视图,我将其构建到请求的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();
答案 0 :(得分:0)
好吧,出于性能考虑,我会将接口从IEnumerable<T>
更改为具有Count属性的集合。 IList<T>
和ICollection<T>
都有count属性。
这样,集合对象就会跟踪它的大小,你只需要阅读它。
如果你真的想避免循环,可以将RecordCount重新定义为一个延迟加载的整数,调用GetViewSpecificQuery来获取计数一次。
private int? _recordCount = null;
public int RecordCount
{
get
{
if (_recordCount == null)
_recordCount = GetViewSpecificQuery(view.CustomFilters).Count;
return _recordCount.Value;
}
}