实体框架4和Linq到实体规范:如何编码?

实体框架4和Linq到实体规范:如何编码?,linq,entity-framework-4,expression-trees,specification-pattern,Linq,Entity Framework 4,Expression Trees,Specification Pattern,我放弃了这段代码,因为它是有效的,但我真的需要重构到一些可以接受的东西。它接受一组查询对象(看起来像productid=3的字符串),然后将它们添加到我的查询中。这只适用于逻辑AND,但我最终需要几个不同的逻辑运算符(OR,NOT) 链接到网站,例如代码,当然会很感激。我看到的唯一类似的东西是: 但这并不是EF4所特有的。为什么不将查询转换为实体SQL 您可以将查询创建为字符串,并将这些术语附加到该SQL查询中 嗯 看看,它可能会满足你的需要,或者至少会给你一些想法 据我所知,您可能可

我放弃了这段代码,因为它是有效的,但我真的需要重构到一些可以接受的东西。它接受一组查询对象(看起来像productid=3的字符串),然后将它们添加到我的查询中。这只适用于逻辑AND,但我最终需要几个不同的逻辑运算符(OR,NOT)


链接到网站,例如代码,当然会很感激。

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

但这并不是EF4所特有的。为什么不将查询转换为实体SQL

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

看看,它可能会满足你的需要,或者至少会给你一些想法

据我所知,您可能可以做以下事情:

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

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

composedSpec &&= orderSpec; // adds all the order fields

我是这里唯一一个没有抓住这些方法背后要点的人吗?让调用者自己将LINQ调用链接在一起,而不是试图过度设计一些东西来隐藏它们,这难道不是更容易吗?字段来自客户机。客户端是一个来回发送JSON的web浏览器。我需要遍历客户端提供的每一个表达式并实现它。如何将JSON反序列化为.NET对象(我们称之为搜索条件),然后为已知的搜索条件结构构建Linq to entities查询?只要表达式是强类型的,您仍然必须遍历所有逻辑“where”并将其附加到原始查询中。似乎可行,只需要一些例子。对我来说,这是一个重要的if声明。动态SQL唯一的问题是它不是强类型的。规范模式将是强类型的,使用Lambda表达式表示参与。p=>p.name对于动态SQL,我同意,您可以使用Cast来转换为适当的类型。实体SQL可以工作。
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)
    }
var originalQuery = ...;
foreach( var spec in mySpecs)
{    originalQuery = spec(originalQuery);  //adds all the where clauses
}

originalQuery = orderSpec( originalQuery); // adds all the order fields
var originalSpec = ...;
var composedSpec = originalSpec;

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

composedSpec &&= orderSpec; // adds all the order fields