Скажите, что я в утверждении select запроса:
context.Orders.Where(expr).Select(o => new OrderInfo{ ... }).ToList();
И у меня есть список выражений (подмножество того, что выражено в expr
), но не все, которые будут выполнены (идея состоит в том, что все они были добавлены при условии OrElse
):
List<Expression<Func<Order, bool>>> exprAppliedList;
Вы можете представить их так:
o => o.BillingFirstName == xStr,
o => o.BillingLastName == xStr,
o => o.ShippingFirstName == xStr,
o => o.ShippingLastName == xStr,
o => o.BillingFirstName == yStr,
o => o.BillingLastName == yStr,
o => o.ShippingFirstName == yStr,
o => o.ShippingLastName == yStr,
Хитрость в том, что перед тем, как я .ToList (), я бы хотел как-то индексировать , сколько , выражений или я соответствовал этому единственному порядку.
Если я наберу «Джон» и у кого-то будет BillingFirstName = "John" BillingLastName = "John", ShippingFirstName = "John", and ShippingLastName = "John"
, я мог бы назначить ему что-то вроде SearchValue = 4
,
У меня есть много причин хотеть сделать это до .ToList (), во-первых, мне просто не нужны эти поля кроме фильтрации. Во-вторых, мне пришлось бы генерировать набор различных выражений, если бы я хотел сравнить их после факта, поскольку они будут иметь тип List<Expression<Func<OrderInfo, bool>>>
.
Я понимаю, что EF Linq не будет принимать чепуху, пользовательские функции или даже множество методов расширения. Но это уже список лямбда-выражений, который, похоже, и есть то, что ест Линк на завтрак.
Думаю, я мог бы сделать это после ToList (), и, возможно, все просто скажут, что это то, что я должен делать ... Но мне также любопытно, возможно ли это, потому что я любопытный парень ... И Я думаю, что это может быть полезно во многих сценариях.
Я пробовал что-то дурацкое, вроде:
context.Orders.Where(expr).Select(o => new OrderInfo
{
...
SearchValue = ExpressionMatchList.Any()
? ExpressionMatchList.Count(e => e.Compile().Invoke(o))
: 0,
}).ToList();
но затем Линк взорвался в каком-то подземном слое. Самая значимая ошибка, казалось, говорила что-то вроде
'Unable to process the type '.....[Order].....', because it has no known mapping to the value layer.
> StackTrace: at
> System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.NewArrayInitTranslator.TypedTranslate(ExpressionConverter
> parent, NewArrayExpression linq)
Во всяком случае ... Я ценю ваши мысли и соображения по этому поводу, даже если это окажется совершенно ненормальной идеей работы.