C# 是否可以将单个linq查询结果分配给多个变量?
我可以在TSQL中实现这一点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 =
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查询还是一个数据库查询?我想要一个数据库调用,而不是多个。