首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Entity Framework4和Linq to Entities规范:如何编码?

Entity Framework4和Linq to Entities规范:如何编码?
EN

Stack Overflow用户
提问于 2010-11-19 10:14:41
回答 2查看 576关注 0票数 0

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

代码语言:javascript
复制
-- 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)

我也有这个订单:

代码语言:javascript
复制
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 Framework4和C#的保护伞下。

做这样的事情真的很好,这基本上就是上面所做的。

代码语言:javascript
复制
var originalQuery = ...;
foreach( var spec in mySpecs)
{    originalQuery = spec(originalQuery);  //adds all the where clauses
}

originalQuery = orderSpec( originalQuery); // adds all the order fields

链接到网站,示例代码,肯定会很感激。

EN

回答 2

Stack Overflow用户

发布于 2010-11-19 22:49:49

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

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

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

  • http://msdn.microsoft.com/en-us/library/bb387145.aspx
  • http://msdn.microsoft.com/en-us/library/bb738683.aspx

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

HTH。

票数 1
EN

Stack Overflow用户

发布于 2012-02-13 00:03:13

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

据我所知,你也许可以这样做:

代码语言:javascript
复制
var originalSpec = ...;
var composedSpec = originalSpec;

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

composedSpec &&= orderSpec; // adds all the order fields
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4221544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档