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

时间:2013-04-11 15:54:05

标签: sql entity-framework extension-methods iqueryable

我不确定这是否是解决这个问题的正确方法,所以我希望通过这个问题能够获得领先优势。

假设我在大多数表中都有一个包含特定重复列的数据库。在我的大多数(如果不是全部)查询中,我必须对此特定列进行过滤(即检查它是否为空)。 这导致在该地方散布着很多'。(其中x => x.Thingy == null)'。

本身这当然不是一个问题,但我想知道我是否可以把这种行为放在'更高'的某个地方,比如IQueryable,作为标准行为。有了侧面注意,在极少数情况下,过滤是不需要的。基本上,对表的每个(部分)查询都需要使用'WHERE thingy IS NULL'进行扩展,并在连接等中交织。

问题在于我真的不太清楚从哪里开始。我不是在寻找实现,因为我宁愿自己想出详细的细节。

我正在寻找的是一个可以开始的地方,或者如果可能的话。 IQueryable是正确的开始方式吗?

2 个答案:

答案 0 :(得分:1)

您应该能够简单地公开预过滤的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属性。

答案 1 :(得分:0)

你也可以在Thing上使用扩展方法:

public static class ThingExtensions
{
    public static IQueryable<Thing> WithoutThingy(this IQueryable<Thing> query)
    {
        return query.Where(x => x.Thingy == null);
    }
}

然后你就这样使用它:

Things.WithoutThingy().Select(...)