繁体   English   中英

LINQ查询的一部分,用于分离方法(EF Core)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM