Я выбросил этот код, потому что он работал, но мне действительно нужно сделать рефакторинг для чего-то приемлемого. Он принимает набор объектов запроса (строки, которые выглядят как productid = 3), а затем добавляет их в мой запрос. Это работает только для логического И, но в конечном итоге мне понадобятся несколько различных логических операторов (ИЛИ, НЕ).
-- 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
Ссылки на веб-сайты, пример кода, несомненно, будут оценены.