0

我放弃了这段代码,因为它有效,但我真的需要重构一些可以接受的东西。它接受一组查询对象(看起来像 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

网站链接,示例代码,肯定会受到赞赏。

4

2 回答 2

1

看看LinqSpecs,它可能会做你需要的,或者至少给你一些想法。

据我了解,您可能可以执行以下操作:

var originalSpec = ...;
var composedSpec = originalSpec;

foreach(var spec in mySpecs)
{    
    composedSpec &&= spec;  //adds all the where clauses
}

composedSpec &&= orderSpec; // adds all the order fields
于 2012-02-12T16:03:13.357 回答
1

我唯一看到类似的东西是这样的:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

但这并不特定于 EF 4。为什么不将查询转换为实体 SQL?

您可以将查询创建为字符串,并将这些术语附加到该 SQL 查询。

HTH。

于 2010-11-19T14:49:48.563 回答