【问题标题】:Selecting all rows based on a distinct column in Entity Framework Core根据 Entity Framework Core 中的不同列选择所有行
【发布时间】:2019-01-31 20:29:20
【问题描述】:

我有一个包含一些数据的表,我想使用 .NET 核心实体框架选择具有唯一日期的行。我想将结果作为唯一行的列表返回。这是代码。

public async Task<IEnumerable<Records>> GetUniqueRecordsByDate(int bId)
{
     var rowsToReturn = await _context.Records
                .Where(b => b.SId == bId)
                .Select(d => d.Date)
                .Distinct()
                .OrderBy(d => d)
                .ToListAsync();
     return rowsToReturn;
} 

我正在尝试应用上述代码,但出现此错误

不能隐式转换类型'System.Collections.Generic.List>'to 'System.Collections.Generic.IEnumerable'。存在显式转换(您是否缺少演员表?)

是否有其他方法可以实现我的期望,或者我的代码中缺少某些内容?

【问题讨论】:

    标签: c# linq asp.net-core entity-framework-core


    【解决方案1】:

    首先制作一个DTO如下:

    public class RecordsByDateDTO
    {
        public DateTime Date {get; set;}
        public List<Record> Records {get; set;}
    }
    

    要选择具有唯一日期的行,您必须使用 .GroupBy 并编写您的 GetUniqueRecordsByDate 方法,如下所示:

    public async Task<List<RecordsByDateDTO>> GetUniqueRecordsByDate(int bId)
    {
         var recordsByDate = await _context.Records.Where(r => r.SId == bId).GroupBy(r => r.Date)
                                  .Select(group => new RecordsByDateDTO
                                  {
                                       Date =  group.Key,
                                       Records = group.ToList()
                                  }).OrderBy(r => r. Date).ToListAsync();
    
        return recordsByDate;
    } 
    

    【讨论】:

    • 错误仍然出现。我还要补充一点,代码位于 Task> 类型的函数内,它应该返回记录列表。不知道是不是这个错误的原因。
    • 您是否使用`IEnumerable' 而不是varrecordsByDate 变量?
    • 我正在使用 var 但执行完成后该函数需要返回 recordsByDate。返回的 recordsByDate 是产生错误的那个。这是函数。 public async Task> GetUniqueRecordsByDate(int bId) { // 上面你提供的代码放在这里。最后我返回 recordsByDate }
    • 我该怎么做。团队查看器?
    • 我的网络连接不稳定,您可能会遇到一些延迟。我可以提供其他可以提供帮助的东西吗?文件什么的
    【解决方案2】:
    var rowsToReturn = await _context.Records
                .Where(b => b.SId == bId)
                .Select(d => d.Date)
                .Distinct()
                .OrderBy(d => d)
                .AsEnumerable()
                .ToListAsync();
    return rowsToReturn;
    

    在 ToListAsync() 之前使用 AsEnumerable()。它会起作用的。

    【讨论】:

    • 注意:AsEnumerable 会导致整个表被复制到内存中。
    • AsEnumerable 抵消了ToListAsync 的所有好处。只是不要使用它
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多