LINQ 查询到单独方法的一部分(EF 核心)



我想这之前已经问过了,但我找不到任何好的例子。我有这个疑问。

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 的便捷方法。适用于此类简单方案的属性。

因此,如果该方法包含指向类型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();

我遇到了同样的问题。 您可以使用包含日期时间字段的接口扩展实体类,如下所示:

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

最新更新