Я выбросил этот код, потому что он работал, но мне действительно нужно реорганизовать что-то приемлемое. Он принимает набор объектов запроса (строки, которые выглядят как productid = 3), затем добавляет их в мой запрос. Это работает только для логического И, но в конечном итоге мне понадобится несколько разных логических операторов (ИЛИ, НЕ).Спецификации Entity Framework 4 и Linq to Entities: как закодировать его?
-- Idea here is add the where clause to the original query and return a new one
private static IQueryable<Product> GetFilteredQuery(string condition,
IQueryable<Product> originalQuery)
{
-- REPETITION
if(-- Regex comparison looking for "productid = 123" --)
{
returnQuery = originalQuery.Where(
p => p.myEntity.SelectMany(q => q.subEntity) // spec expression
.Any(r => r.id == foundid));
}
... (one if statement for each specification, calling this several times)
У меня также есть это для заказа:
private static IQueryable<Product> GetOrderedQuery(IList<string> fields,
IQueryable<Product> originalQuery)
{
var resultQuery = originalQuery;
bool firstTime = true;
foreach(var field in fields)
{
-- REPETITION
if(field == "id")
{ if(firstTime == true)
{ resultQuery = resultQuery.OrderBy(p => p.id);
firstTime = false;
}
else
{ resultQuery = resultQuery.ThenBy(p => p.id);
}
}
... (one for each field to order by)
}
Так как я мог инкапсулировать каждое повторение, чтобы объект спецификации, где я могу как-то прикрепить эту коллекцию спецификаций к моему первоначальному запросу, в том числе для того, выражения? Это находится под Linq to Entities, Entity Framework 4 и C# зонтик.
Было бы очень приятно сделать что-то подобное, что по существу то, что делает выше.
var originalQuery = ...;
foreach(var spec in mySpecs)
{ originalQuery = spec(originalQuery); //adds all the where clauses
}
originalQuery = orderSpec(originalQuery); // adds all the order fields
Ссылки на веб-сайты, например, код, несомненно, будут оценены.
Я только один здесь отсутствует точка за этими методами? Разве не проще было бы позволить вызывающему абоненту объединить вызовы LINQ, а не пытаться переусердствовать что-то, чтобы скрыть это от них? –
Поля поступают от клиента. Клиент - это веб-браузер, отправляющий JSON туда и обратно. Мне нужно будет перебирать все предоставленные от клиента и реализовывать их. –
Как насчет десериализации объекта JSON для .NET (позволяет назвать его условиями поиска), а затем построить Linq для запросов объектов для хорошо известной структуры условий поиска? –