我放弃了这段代码,因为它有效,但我真的需要重构一些可以接受的东西。它接受一组查询对象(看起来像 productid = 3 的字符串),然后将它们添加到我的查询中。这仅适用于逻辑 AND,但我最终将需要一些不同的逻辑运算符(OR、NOT)。
-- 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
网站链接,示例代码,肯定会受到赞赏。