Создание многоразовых запросов Linq - PullRequest
3 голосов
/ 19 августа 2010

У меня есть запрос выбора, который используется снова и снова с различными where фильтрами:

var query = from row in context.Table select row;

Как я могу сохранить это в статической переменной класса, чтобы я мог использовать ее в других методах? Как:

var results1 = query.Where(condition1);
...
var results2 = query.Where(condition2);

Ответы [ 6 ]

5 голосов
/ 19 августа 2010

Вы на правильном пути.

Попробуйте создать новый метод вместо переменной:

public IQueryable<Cust> ListActiveCustomers()
{
     return dataContext.Customers.Where(c=>c.IsActive==true);
}

Затем вы можете использовать это из любого места, где виден метод:

 //Active Customers with no invoices due.
 var activePaidCustomers = ListActiveCustomers().Where(c=>c.InvoicesDue==0)
                                                .OrderByDescending(c=>c.LastPaidOn)
                                                .ToList();
3 голосов
/ 19 августа 2010

Примерно так:

Expression<Func<TypeYoureQueryingAgainst, bool>> query = p => p.Value == someValue; // etc..

Тогда вы можете сделать следующее, где TypeYoureQueryingAgainst находится в хранилище или в любом шаблоне, который вы используете:

repository.Where(query);

Надеюсь, что имеет смысл..

2 голосов
/ 19 августа 2010

Этот код:

var query = from row in context.Table select row;

Функционально эквивалентно:

var query = context.Table;

Так что вам не нужно сохранять эту переменную query для ее повторного использования, просто используйте context.Table напрямую:

var results1 = context.Table.Where(condition1);
...
var results2 = context.Table.Where(condition2);
1 голос
/ 19 августа 2010

Ну, первый шаг - выяснить точный тип query.Самый простой способ - пройти через код, используя его в отладчике, и посмотреть, что он говорит о типе (вероятно, IQueryable<RowType> или IOrderedQueryable<RowType>)

1 голос
/ 19 августа 2010

Просто замените var на IEnumerable<RowType> (или IQueryable<RowType>), где RowType - это (неанонимный) тип каждого элемента в последовательности результатов:

static IEnumerable<RowType> query = from ... select row; // row is of RowType.
0 голосов
/ 23 июня 2018

Другой альтернативой, если ваши where фильтры являются простыми скалярами, является создание метода (ов) расширения для свойств DbSet контекста вашей базы данных.

Если ваш DbContext похож на:

public class MyContext : DbContext
{
    ...
    public DbSet<Customer> Customers { get;set; }
    ...
}

Вы можете создавать запросы многократного использования на Customers DbSet, например:

public static class MyDbContextExtension
{
   public static IEnumerable<Customer> GetByName(this DbSet<Customer> customers, string name)
   {
       return customers.Where(c => c.Name.Contains(name));
   }
}

А затем используйте его как:

var context = new MyContext();
var jedis = context.Customers.GetByName("skywalker");
if(jedis.Any())
{
    logger.Log("These aren't the customers you're looking for");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...