2013-04-11 2 views
0

Я не уверен, что это правильный способ приблизиться к этому, так что я надеюсь получить от него руководство по этому вопросу.Расширение IQueryable для изменения поведения по умолчанию

Скажем, у меня есть база данных с определенной повторяющейся колонкой в ​​большинстве таблиц. В большинстве (если не всех) моих запросов мне приходится фильтровать этот столбец (т. Е. Проверять, является ли он нулевым). Это приводит к большому количеству «.Where (x => x.Thingy == null)», разбросанных по всему месту.

Сам по себе это, конечно, не проблема, но мне было интересно, могу ли я это поведение в каком-то «высшем», как в IQueryable, в качестве стандартного поведения. С учетом того, что в некоторых редких случаях фильтрация нежелательна. В основном каждый (часть) запроса по таблице должен быть расширен с помощью «WHERE thingy IS NULL», переплетенного в соединениях и так далее.

Проблема в том, что я действительно не совсем уверен, с чего начать. Я не ищу реализаций, так как я бы предпочел сам описать подробные детали.

То, что я ищу, - это место для начала или если это вообще возможно. Является ли IQueryable правильным способом для запуска?

ответ

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.

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(...) 
Смежные вопросы