Я пытаюсь написать анализируемую библиотеку выражений текста в формате EF. Представьте текстовое поле, в котором пользователь вводит список целых чисел с разделителями-запятыми. Я разберу & разобрать его и сделать из него массив int. Но тогда мне нужно создать выражение для этого один из моих требований является взять ctx => ctx.User.Receipts.Select(x => x.ReceiptID)
и список Квитанция идентификаторов (Интс) и генерировать Expression
, что делает что-то вроде этого:Преобразование выражения <Func <TEntity, IEnumerable <TProperty> >> valueSelector, TValue [] values to Expression <Func <TElement, bool >>
ctx.User.Where(x => x.Receipts.Any(y => listOfIds.Contains(y.ReceiptId));
Я думаю, что это подпись будет что-то вроде этого:
Expression<Func<TEntity, bool>> CreateListExpression(Expression<Func<TEntity, IEnumerable<TProperty>>> accessor, TProperty[] constantValues)
и использование образца будет что-то вроде этого:
ctx => ctx.User.Where(CreateListExpression(x => x.Receipts.Select(y => y.ReceiptId), new int[] { 1, 2, 3, 4, 5 });
... но я гибкий с 1 ограничением. В SQL, я искал что-то сравнимого с этим (с точки зрения того, насколько эффективно я извлечения данных & убедившись, что работа happing SQL-сторона):
select u.*
from Users u
join Receipts on r.UserID = u.UserID
where r.ReceiptID in (1, 2, 3, 4, 5)