Я пытаюсь сделать модульный запрос Linq (к источнику OData).Как разбить выражение Linq внутри предложения Any
Это упрощенная версия моего запроса:
// Any clause that I want to be modular
Func<Encounter, bool> orderAnyClause = x => x.OrderName.StartsWith("Order 00");
// Query using the any clause
var result = entities.Customers.Where(cust=> cust.Orders.Any(orderAnyClause));
// A method to do the selection. It works just fine.
IQueryable<SearchSelectionResult> selectedResults = SelectResults(result);
// This throws the exception shown below
var list = selectedResults.ToList();
Это все отлично компилируется, но когда я его запускаю мой какой-либо пункт вызывает это исключение:
Невозможно привести объект типа ' System.Linq.Expressions.ConstantExpression ', чтобы напечатать «System.Linq.Expressions.LambdaExpression».
Я знаю, что это мое предложение, потому что, если я вставляю предложение в инструкцию, все работает отлично.
Почему я получаю эту ошибку? И как я могу нарушить это утверждение и не получить ошибку?
Update: Использование Expression
Я пытался использовать выражение вроде этого:
Expression<Func<Encounter, bool>> orderAnyClause =
x => x.OrderName.StartsWith("Order 00");
И я получаю следующее время компиляции сообщений об ошибке:
Instance argument: cannot convert from System.Data.Services.Client.DataServiceCollection<ODataComponetizedQueriesTest.MyEntities.Order>' to 'System.Linq.IQueryable<ODataComponetizedQueriesTest.MyEntities.Order>'
Я пробовал это, и он дает ошибку времени компиляции. (Я обновил свой вопрос с сообщением об ошибке.) – Vaccano
Является ли свойство Orders IEnumerable? Я предполагаю, что это так. Подпись метода расширения Enumerable.Any не принимает выражение>, поэтому вы не сможете его использовать.Вместо этого вам нужно будет создавать выражения, используя Expression.Lamba, Expression.Call и т. Д., Которые все равно все эти методы расширения. Или вы можете сделать тип ордеров IQueryable , как предлагает кто-то ниже. –