【问题标题】:Extending IQueryable to modify default query behavior扩展 IQueryable 以修改默认查询行为
【发布时间】:2013-04-03 22:06:49
【问题描述】:

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

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

这本身当然不是一个真正的问题,但我想知道是否可以将此行为作为标准行为放在“更高”的某个地方,例如在 IQueryable 中。附带说明的是,在极少数情况下,过滤是不需要的。基本上,对表的每个(部分)查询都需要使用“WHERE thingy IS NULL”进行扩展,并以连接等方式交织在一起。

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

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

【问题讨论】:

    标签: sql entity-framework extension-methods iqueryable


    【解决方案1】:

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

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

    然后你这样使用它:

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

    【讨论】:

      【解决方案2】:

      您应该能够简单地公开一个预先过滤的IQueryable&lt;T&gt; 属性:

      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 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2011-10-02
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        相关资源
        最近更新 更多