Как создавать многократно используемые операторы linq, которые можно включать как часть предложенийwhere, select и даже C#

Место общения программистов C#
Anonymous
Как создавать многократно используемые операторы linq, которые можно включать как часть предложенийwhere, select и даже

Сообщение Anonymous »

Представьте себе следующие классы (значительно упрощенная версия реального варианта использования):

Код: Выделить всё

public class Driver
{
public Int32 Id {get;set;}
public String Name {get;set;}
public String Country {get;set;}
public IEnumerable Drives {get;set;}

public DateTime? FirstDriveDate => this.Drives.Select(o => o.Date).DefaultIfEmpty().Min();

public DateTime? LastDriveDate => this.Drives.Select(o => o.Date).DefaultIfEmpty().Max();
}

public class Drive
{
public Int32 Id {get;set;}
public DateTime Date {get;set;}
public Int32 Distance {get;set;}
}
В моем приложении свойства FirstDriveDate и LastDriveDate играют важную роль и часто визуализируются в пользовательском интерфейсе. Но они также мне очень нужны в запросах LINQ. В предложениях WHERE, в предложениях ORDER BY и в предложениях SELECT. Прямо сейчас, когда у меня есть запрос, который должен использовать эти «свойства», я просто переписываю точную часть linq в большем запросе. Но если в будущем «определение» расчета FirstDriveDate изменится, мне также придется вручную обновить все мои запросы LINQ. Есть ли способ переписать эти свойства как «Выражения», чтобы я мог просто интегрировать их в свои запросы? Тем более, что в зависимости от ситуации я хочу, чтобы логика выполнялась на базе данных, а не сначала загружала все объекты в память и только потом применяла фильтр/сортировку.
Например:

Код: Выделить всё

var topNewUKDrivers = database.GetAll()
.Where(o => o.FirstDriveDate.Year == DateTime.Today.Year && o.Country == "UK")
.OrderBy(o => o.FirstDriveDate)
.ThenBy(o => o.Name).ToList()
Вместо:

Код: Выделить всё

var topNewUKDrivers = database.GetAll()
.Where(o => o.Drives.Select(p => p.Date).DefaultIfEmpty().Min().Year == DateTime.Today.Year && o.Country == "UK")
.OrderBy(o => o.Drives.Select(p => p.Date).DefaultIfEmpty().Min())
.ThenBy(o => o.Name).ToList()
Я пробовал использовать такие выражения, как следующие:

Код: Выделить всё

public static Expression FirstDriveDateEx => (driver) => driver.Drives.Select(o => o.Date).DefaultIfEmpty().Min();
и это работает, если вы добавите это в предложениеwhere с помощью '.Where(FirstDriveDateEx)', но не если вы хотите объединить его с другими частями/фильтрами.

Подробнее здесь: https://stackoverflow.com/questions/798 ... of-a-where

Вернуться в «C#»