Добавление где к общему выражению в пользовательском Entity Framework Core .IncludeC#

Место общения программистов C#
Ответить
Anonymous
 Добавление где к общему выражению в пользовательском Entity Framework Core .Include

Сообщение Anonymous »

У нас есть собственный статический класс, содержащий собственный метод .Include, который будет использоваться при использовании Entity Framework Core для вызова репозитория. Мы хотели бы, чтобы включение использовало любой предоставленный селектор, например i.Documents, как показано здесь:

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

private readonly IRepository _itemRepository;

var item = await _itemRepository.GetAll()
.IncludeCheckingSecurity(i => i.Documents)
.SingleAsync();
А если репозиторий определенного типа (

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

IObjectWithSecurity
), а селектор имеет определенный тип (

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

IEnumerable
IObjectWithSecurity), чтобы добавить дополнительный .Where() для фильтрации селектора по свойству, существующему в IObjectWithSecurity:

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

public static IIncludableQueryable IncludeCheckingSecurity(
this IQueryable source,
Expression propertySelector)
where TRepositoryType : class
{
var previousType = typeof(TRepositoryType);
var thisInclude = typeof(TThisInclude);

if (typeof(IObjectWithSecurity).IsAssignableFrom(previousType) && typeof(IEnumerable).IsAssignableFrom(thisInclude))
{
// Want to add a where to 'propertySelector' which filters it on a property within IObjectWithSecurity (which we have proved it is above)
return source.Include(propertySelector);
}
}
РЕДАКТИРОВАТЬ
Например, этот вызов репозитория:

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

private readonly IRepository _itemRepository;

var item = await _itemRepository.GetAll()
.IncludeCheckingSecurity(i => i.Documents)
.SingleAsync();
На самом деле это должно привести к следующему:

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

private readonly IRepository _itemRepository;

var item = await _itemRepository.GetAll()
.IncludeCheckingSecurity(i => i.Documents.Where(a => a.AllowAccess))
.SingleAsync();
Где i.Documents — это Enumerable типа, наследуемого от IObjectWithSecurity. А AllowAccess — это свойство IObjectWithSecurity:

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

public interface IObjectWithSecurity
{
public bool AllowAccess { get; set; }
}
Мы экспериментировали с созданием дополнительных выражений и использованием лямбда-выражений для их объединения:

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

Expression whereToAppend = e => ((IObjectWithSecurity)e).AllowAccess;
var newIncludeWithWhere = Expression.Lambda(Expression.AndAlso(propertySelector, whereToAppend), propertySelector.Parameters);
return source.Include(newIncludeWithWhere);
Но, судя по всему, безуспешно, это больше предназначено для объединения двух выраженийwhere вместо выражения доступа к члену и выраженияwhere в его коллекции.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ore-includ
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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