是否可以将单个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);

这是无效的,因为它在数据库中调用两个单独的查询

是否可以将单个linq查询结果分配给多个变量?

你可以尝试这样做:

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);