/ / Как мога да изградя логика при доставената логика в LINQ-до-Entities Където израз? - c #, рамка на обекти, linq, изрази-дървета

Как мога да се изгради логика върху предоставената логика в LINQ-към-Entities Къде израз? - c #, entity-framework, linq, expression-trees

Често срещам, в LINQ за Entity Framework, модел, в който добавям a .Where клауза, ако е посочена стойност на низа, като:

IQueryable<Foo> query = Foos.AsQueryable()
if (!string.IsNullOrWhitespace(nameFilter)) query = query.Where(x => x.Name == name);
if (!string.IsNullOrWhitespace(addressFilter) != null) query = query.Where(x => x.Address == addressFilter );
if (!string.IsNullOrWhitespace(cityFilter) != null) query = query.Where(x => x.City == cityFilter );
// ...

Исках да изчистя това и да избягвам повтарянето на филтъра. Мислех, че мога да създам метод за разширение:

public static IQueryable<T> WhereEqualIfSpecified<T>(
this IQueryable<T> query,
Expression<Func<T, string>> fieldDelegate,
string filterValue)
{
return string.IsNullOrWhiteSpace(filterValue)
? query
: query.Where(x => fieldDelegate(x) == filterValue);  // not valid, see question below
}

За да мога вместо това да променя кода си на:

IQueryable<Foo> query = Foos.AsQueryable()
.WhereEqualIfSpecified(x => x.Name, nameFilter)
.WhereEqualIfSpecified(x => x.Address, addressFilter)
.WhereEqualIfSpecified(x => x.City, cityFilter)
// ...
;

Но открих, че в WhereEqualIfSpecified метод по-горе, fieldDelegate трябва да се събере в a Func() да бъдат извикани срещу източника на обекта, който разрушава точката на извършване на тези стъпки, които ще бъдат изпълнени в базата данни в оригиналния ми код.

Липсва ми последната стъпка как да създам нова Expression от fieldDelegate което може да направи сравнение, вместо просто да върне стойността на низовете. Ще работи ли този подход? Как да направя необходимото Expression в WhereEqualIfSpecified да разрешите на LINQ-към-обекти да го изпълнят по-късно?

Отговори:

2 за отговор № 1

Това, което се опитвате да направите тук, е да съставяте изрази. Тук е едно изпълнение на начина за съставяне на изрази. След като имате това Compose метод можете да напишете метода на разширение като:

public static IQueryable<T> WhereEqualIfSpecified<T>(
this IQueryable<T> query,
Expression<Func<T, string>> fieldExpression,
string filterValue)
{
return string.IsNullOrWhiteSpace(filterValue)
? query
: query.Where(fieldExpression.Compose(value => value == filterValue);
}