使用c#Func作为IQueryable的一部分而不执行内存调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用c#Func作为IQueryable的一部分而不执行内存调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1895字,纯文字阅读大概需要3分钟。
内容图文
![使用c#Func作为IQueryable的一部分而不执行内存调用](/upload/InfoBanner/zyjiaocheng/964/2cd5d6a166294a0fbb9d62a523ee5b3d.jpg)
我正在尝试构建一个将作为IQueryable而不是在内存(IEnumerable)中对数据库执行的查询.
该查询将用于多个不同的目的,每个目的的计算Total属性的方式略有不同.
因为我使用Func来计算总数,所以我得到一个错误,告诉我sql不知道如何处理我的Func的Invoke方法,这是可以理解的.
为了解决这个问题,我不得不通过调用ToList()来将分组列入memor,这对性能不利.
有没有办法可以将此查询作为IQueryable执行?否则我将不得不用计算差异写20次这个查询
Func<IGrouping<object, MyType>, double?> calculateTotal= (group) => @group.Sum(x => x.PassengerTotal);
Dictionary<object, double?> weekValues = queryable.GroupBy(o => new
{
Year = SqlFunctions.DatePart("yyyy", o.DateCreated),
Week = SqlFunctions.DatePart("ww", o.DateCreated),
Source = o.SourceId,
})
.ToList() //NEED TO REMOVE THIS CALL
.Select(ac => new WeeklyGraphGroup()
{
Year = ac.Key.Year,
Week = ac.Key.Week,
SourceId = ac.Key.Source,
Total = calculateTotal(ac)
})
.ToDictionary(dict =>
new
{
Year = dict.Year,
Week = dict.Week,
Source = dict.SourceId
}, grp => grp.Total);
解决方法:
创建一个分部类,如下所示:
public partial class WeeklyGraphGroup
{
public int ? Year { get; set; }
public int ? Week { get; set; }
public int Source { get; set; }
}
public partial class WeeklyGraphGroup
{
private int ? _Total;
public int ? Total
{
get
{
this._Total = CalculateTotal(this.Year, this.Week, this.Source);
return this._Total;
}
}
public int ? CalculateTotal(int ? Year, int ? Week, int Source)
{
// do your calculation and return the value of total
// use whatever formula you want here. I guess you are calculating
// total based on any of the parameters(year, week or source);
return value;
}
}
然后按以下方式进行查询:
var list = db.Stores.GroupBy(o => new WeeklyGraphGroup
{
Year = SqlFunctions.DatePart("yyyy", o.DateCreated),
Week = SqlFunctions.DatePart("ww", o.DateCreated),
Source = o.SourceId,
})
.Select ( u => new WeeklyGraphGroup
{
Year = u.Key.Year,
Week = u.Key.Week,
Source = u.Key.Source
}
).ToList();
总计将自动更新
内容总结
以上是互联网集市为您收集整理的使用c#Func作为IQueryable的一部分而不执行内存调用全部内容,希望文章能够帮你解决使用c#Func作为IQueryable的一部分而不执行内存调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。