Как провести рефакторинг нескольких похожих запросов Linq? - PullRequest
2 голосов
/ 14 мая 2009

Предположим, у меня есть два следующих запроса Linq, которые я хочу реорганизовать:

var someValue1 = 0;
var someValue2= 0;
var query1 = db.TableAs.Where( a => a.TableBs.Count() > someValue1 )
                  .Take( 10 );
var query2 = db.TableAs.Where( a => a.TableBs.First().item1 == someValue2)
                  .Take( 10 );

Обратите внимание, что изменяется только параметр Where. Есть ли способ поместить запрос в метод и передать параметр Where в качестве аргумента?

Ответы [ 4 ]

2 голосов
/ 14 мая 2009

Вы можете использовать Predicate<T>.

public IQueryable<TableA> Helper(Predicate<TableA> predicate)
{
    return db.TableAs.Where(predicate).Take(10);
}

Просто назови это так.

var query1 = Helper(a => a.TableBs.Count() > someValue1);
var query2 = Helper(a => a.TableBs.First().item1 == someValue2);

И дай наммен лучше, чем Helper.

2 голосов
/ 14 мая 2009

Коус есть. Параметр where - это просто простое замыкание типа Func<T, bool> (где T - тип элементов вашей БД - я не знаю их из вашего кода), и вы можете заключить его в (анонимную) функцию.

Func<Func<T, bool>, IEnumerable<T>> MakeQuery = (Func<T, bool> whereParam) => db.TableAs.Where(whereParam).Take(10);

Используйте это так

var query1 = MakeQuery(a => a.TableBS.Count() > someValue1);
1 голос
/ 14 мая 2009

Вы можете сделать это так же, как и любой другой код:

T MyQuery(U db, Func<TSource, bool> pred) {
  return db.TableAs.Where( pred )
                  .Take( 10 );
}

где T и U - любые типы, имеющие отношение к вашему запросу.

1 голос
/ 14 мая 2009

Да, тип параметра - это выражение lamba Func<TSource, bool>

Func<Person, bool> c1 = p => p.LastName == "1";
Persons.Where(c1);
Func<Person, bool> c2 = p => p.FirstName == "2";
Persons.Where(c2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...