扩展IQueryable以修改默认查询行为

id_aut 发布于 2019-03-09 iqueryable 最后更新 2019-03-09 14:32 4 浏览

我不确定这是否是解决这个问题的正确方法,所以我希望通过这个问题获得领先。 假设我在大多数表格中都有一个包含特定循环列的数据库。在大多数(如果不是全部)我的查询中,我必须对这个特定的列进行过滤(即检查它是否为空)。 这导致了很多'.Where(x => x.Thingy == null)'散布在这个地方。 当然,这当然不是真正的问题,但我想知道是否可以将这种行为集中在“更高”的地方,如IQueryable中的标准行为。在一些罕见的情况下,过滤是不必要的。基本上,表上的每个(部分)查询都需要用'WHERE thingy IS NULL'进行扩展,交织在连接等等中。 问题是我真的不确定从哪里开始。我不想看到实现,因为我宁愿自己仔细考虑一下这些细节。 我正在寻找的是一个可以开始的地方,或者如果这是可能的话。 IQueryable是否正确启动?

已邀请:

emagni

赞同来自:

您应该能够简单地公开预过滤的IQueryable<T>属性:

public class ThingContext : DbContext
{
   public DbSet<Thing> Things
   {
      get { return Set<Thing>(); }
   }
public IQueryable<Thing> ThingsWithoutThingy
   {
      get { return Things.Where(x => x.Thingy == null); }
   }
}
任何插入和未过滤的查询都需要在Things属性上完成。任何筛选的查询都应使用ThingsWithoutThingy属性。

frerum

赞同来自:

您还可以在Thing上使用扩展方法:

public static class ThingExtensions
{
    public static IQueryable<Thing> WithoutThingy(this IQueryable<Thing> query)
    {
        return query.Where(x => x.Thingy == null);
    }
}
然后你像这样使用它:
Things.WithoutThingy().Select(...)