不应用 LINQ where 子句的扩展方法
Extension method not applying LINQ where clause
我正在尝试在我的代码中实现查询 objects,但遇到了问题。将 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; }
}
扩展方法 return 是原始查询。 LINQ 运算符不修改原始查询,它们 return 一个新查询。不过,扩展方法不会 return 新查询。
应该改写为:
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;
}
我正在尝试在我的代码中实现查询 objects,但遇到了问题。将 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; }
}
扩展方法 return 是原始查询。 LINQ 运算符不修改原始查询,它们 return 一个新查询。不过,扩展方法不会 return 新查询。
应该改写为:
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;
}