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

C# 是否可以将单个linq查询结果分配给多个变量?,c#,linq,entity-framework,entity-framework-6,C#,Linq,Entity Framework,Entity Framework 6,我可以在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 =

我可以在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
};

您可以尝试以下方法:

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()
,它强制对数据库查询进行求值。如果有很多项,此调用可能会变得效率低下,但在很多情况下,它仍然非常快。

有时,尝试进行单个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);

您可以使用下一个代码

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

标题:“是”;但这并不是所示代码真正想要的。您想要一个LINQ查询还是一个数据库查询?我想要一个数据库调用,而不是多个。标题:“是”;但这并不是所示代码真正想要的。您想要一个LINQ查询还是一个数据库查询?我想要一个数据库调用,而不是多个。