【问题标题】:Extension method not applying LINQ where clause扩展方法不应用 LINQ where 子句
【发布时间】:2021-04-29 09:54:36
【问题描述】:

我正在尝试在我的代码中实现 Query 对象,但遇到了问题。将meetId = 1 传递给GetMeetingDTO 时,SingleOrDefault() 会引发异常。我的数据库目前举行 6 次会议,所有会议都具有唯一的 ID (1-6)。我检查了值是否通过FilterOptions 正确传递到FilterMeetingsBy 并且我看起来没问题(使用Visual Studio)。显然没有应用过滤因此SingleOrDefault 抛出错误。我已经测试了省略扩展方法并直接在上下文中应用.Where(p => p.Id == 1)。然后就不会报错了……

    public async Task<MeetingDTO> GetMeetingDTO(long meetId)
    {
        IEnumerable<Meeting> meetings = await context.MeetDbSet
            .FilterMeetingsBy(new FilterOptions { MeetingId = meetId }).ToListAsync();

        return mapper.Map<MeetingDTO>(meetings.SingleOrDefault());
    }

这里是扩展方法

public static class FilterMeetings
{
    public static IQueryable<Meeting> FilterMeetingsBy(this IQueryable<Meeting> meetings, FilterOptions options)
    {
        if (options == null)
            return meetings;

        if (options.MeetingId.HasValue)
        {
            meetings.Where(p => p.Id == options.MeetingId.Value);
            return meetings;
        }

        if (options.SortFromDate.HasValue)
            meetings.Where(p => p.StartDate >= options.SortFromDate.Value);
        if (options.SortToDate.HasValue)
            meetings.Where(p => p.StartDate <= options.SortToDate.Value);

        return meetings;
    }
}

public class FilterOptions
{
    public long? MeetingId { get; set; }

    public DateTime? SortFromDate { get; set; }
    public DateTime? SortToDate { get; set; }
}

【问题讨论】:

  • 抛出了什么异常?

标签: entity-framework-core dbcontext .net-5


【解决方案1】:

扩展方法返回原始查询。 LINQ 运算符不会修改原始查询,它们会返回一个新查询。但是扩展方法不会返回新的查询。

应该改写成:

public static IQueryable<Meeting> FilterMeetingsBy(
        this IQueryable<Meeting> query, 
        FilterOptions options)
{
    if (options == null)
        return query;

    if (options.MeetingId.HasValue)
    {
        query =query.Where(p => p.Id == options.MeetingId.Value);
        return query;
    }

    if (options.SortFromDate.HasValue)
    {
        query=query.Where(p => p.StartDate >= options.SortFromDate.Value);
    }
    if (options.SortToDate.HasValue)
    {
        query=query.Where(p => p.StartDate <= options.SortToDate.Value);
    }

    return query;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2018-12-24
    • 2019-11-08
    相关资源
    最近更新 更多