[英]Part of LINQ query to seperate method (EF Core)
我想这已经被问过了,但是我找不到任何好的例子。 我有这个查询。
series = await query
.GroupBy(o => new { o.AddedDate.Date.Month, o.AddedDate.Date.Year })
.Select(g => new DateLineGraphItem
{ Legend = new DateTime(g.Key.Year, g.Key.Month, 1), Number = g.Count() })
.ToListAsync();
除了我的数据库在所有“ AddedDate”列中使用不同的名称外,其他所有内容始终都是相同的,而我正在尝试弄清楚如何将其分解为自己的方法,类似这样。
List<DateLineGraphItem> series = GroupByAndSelect("AddedDate")
List<DateLineGraphItem> series = GroupByAndSelect("CreatedDate")
我是否必须使用表达式和谓词以及所有这些内容,或者可以通过某些简单方式进行?
我是否必须使用表达式
使用表达式(整个LINQ基于该概念)总是比使用魔术字符串更好。 唯一的问题是,还没有现成的解决方案可以将其他表达式组成表达式,因此您需要编写自己的或使用第三方包装。
另一方面, nameof
运算符消除了大多数string
缺陷。 EF Core为此类简单场景提供了一种名为EF.Property的便捷方法。
因此,如果该方法包含指向属性DateTime
类型的直接属性的string propertyName
参数,则可以简单地将o.AddedDate
替换为EF.Property<DateTime>(o, propertyName)
,例如
series = await query
.GroupBy(o => new { EF.Property<DateTime>(o, propertyName).Date.Month, EF.Property<DateTime>(o, propertyName).Date.Year })
.Select(g => new DateLineGraphItem
{ Legend = new DateTime(g.Key.Year, g.Key.Month, 1), Number = g.Count() })
.ToListAsync();
我有同样的问题。 您可以使用包含DateTime字段的接口扩展实体类,如下所示:
public class EntityDb1 : IDatedEntity
{
public DateTime AddedDate { get; set; }
public DateTime MyDate => AddedDate;
}
public class EntityDb2 : IDatedEntity
{
public DateTime CreatedDate { get; set; }
public DateTime MyDate => CreatedDate;
}
public interface IDatedEntity
{
DateTime MyDate{ get; }
}
然后执行查询
public class Test
{
public static async Task<IEnumerable<DateLineGraphItem>> ExecuteQuery(IQueryable<IDatedEntity> entityList)
{
return await entityList
.GroupBy(o =>new { o.MyDate.Date.Month, o.MyDate.Date.Year })
.Select(g => new DateLineGraphItem(){ Legend = new DateTime(g.Key.Year, g.Key.Month, 1), Number = g.Count() })
.ToListAsync();
}
}
public class DateLineGraphItem
{
public DateTime Legend { get; set; }
public int Number { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.