是否可以将单个linq查询结果分配给多个变量?
本文关键字:分配 变量 结果 查询 单个 linq 是否 | 更新日期: 2023-09-27 18:09:57
我可以在TSQL中做到这一点
SELECT
@TotalDays = COUNT(Days),
@TotalHours = SUM(Hours)
FROM
Schedule
WHERE
GroupID = 1
如何在linq中实现单查询,我的当前代码;
var totalDays = 0;
var totalHours = 0;
totalDays = _schedule.Count(c => c.GroupID == 1);
totalHours = _schedule.Where(w => w.GroupID == 1).Sum(s => s.Hours);
这是无效的,因为它在数据库中调用两个单独的查询
你可以尝试这样做:
var result = _schedule.Where(s => s.GroupID == 1)
.GroupBy(x => x.GroupID)
.Select(gr => new
{
TotalDays = gr.Count(),
TotalHours = gr.Sum(s=>s.Hours);
});
最初,您根据GroupID
筛选数据。你选择那些GroupID
等于1的。然后你通过他们的ID给他们GroupBy
。这可能看起来有点傻,但是这样可以创建一组数据。然后你数一数组里的项,然后计算你想要的和。最后但并非最不重要的是,在创建了GroupBy
之后,选择一个具有两个属性的匿名类型,一个用于TotalDays
,一个用于TotalHours
。
那么你可以像下面这样使用上面的结果:
var totalDays = 0;
var totalHours = 0;
var first = result.FirstOrDefault();
if(first!=null)
{
totalDays = first.TotalDays,
totalHours = first.TotalHours
};
有时,尝试进行单个LINQ查询的问题是,它实际上被转换为多个数据库调用。有时,最好在一次数据库调用中将所有原始数据拉入内存,然后再执行计算。
这将确保只有一个数据库调用:
var data = _schedule.Where(w => w.GroupID == 1).Select(w => w.Hours).ToArray();
var totalDays = data.Count();
var totalHours = data.Sum();
使此工作的关键是.ToArray()
,它强制执行数据库查询的评估。如果有很多项,这个调用可能会变得低效,但在很多情况下,它仍然非常快。
您可以使用下一个代码
//one request to data base
var lstResult=_schedule.Where(w => w.GroupID == 1).ToArray();
//one loop in array for Count method
totalDays = lstResult.Count();
//One loop in array for Sum method
totalHours = lstResult.Sum(s => s.Hours);