在LINQ到实体查询动态条件 [英] Dynamic conditions in Linq-to-Entities query

查看:179
本文介绍了在LINQ到实体查询动态条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将一些旧的代码,直接生成SQL查询实体框架,并在许多似乎有问题(从众多的问题来看围绕着这一话题)传来:如何表达动态where条件在LINQ

I'm trying to convert some old code that directly builds SQL queries to Entity Framework, and came across a problem that many seem to have (judging from the large number of questions surround that topic): how to express dynamic where conditions in linq.

我怎么能表达对LINQ查询下面的代码:

How could I express the following code with a linq query:

    switch (status) {
        case "0":
            sqlwhere = " WHERE status < 0 ";
            break;
        case "-1":
            sqlwhere = " WHERE status = -1 ";
            break;
        case "-100":
            sqlwhere = " WHERE status = -100 ";
            break;
        case "1":
        default:
            sqlwhere = " WHERE status >= 0 ";
            break;
    }

    if (strsearch != "")
        sqlwhere += " AND desc LIKE '%" + strsearch + "%' ";

    string sqlc = "SELECT top 10 * FROM c " + sqlwhere + " order by date desc";



我读过有关 PredicateBuilder 和动态的LINQ扩展在其他职位,但我认为这是一个简单的情况下可能是没有外部库可解的。

I've read about PredicateBuilder and the dynamic Linq extensions in other posts, but I think that a simple case like could be solvable without external libraries.

使用.NET 4.5,EF 5.0,C#,可这是在动态的方式没有建立完整的LINQ语句给每个单独的情况下做了什么?

Using .net 4.5, EF 5.0, C#, can this be done in a "dynamic" way without building the complete linq statement for each single case?

推荐答案

如果你不想使用外部的东西,然后只需用流利的API:

If you don't want to use something external, then simply use fluent API:

var query = db.YourTableName
              .Where(x => x.desc.Contains(strsearch));

switch (status) {
   case "0":
        query = query.Where(x => x.status < 0);
        break;
   case "-1":
        query = query.Where(x => x.status == -1);
        break;
   case "-100":
        query = query.Where(x => x.status == -100);
        break;
   case "1":
   default:
        query = query.Where(x => x.status >= 0);
        break;
}

var result = query.OrderByDescending(x => x.date)
                  .Take(10);

BTW 的您可以创建按状态过滤的扩展方法。和您的查询将如下:

BTW You can create extension method for filtering by status. And your query will look like:

var query = db.YourTableName
              .FilterByStatus(status)
              .Where(x => x.desc.Contains(strsearch))
              .OrderByDescending(x => x.date)
              .Take(10);



扩展方法:

Extension method:

public static IQueryable<YourType> FilterByStatus(this IQueryable<YourType> query, 
                                                  string status)
{

    switch (status) {
       case "0":
            return query.Where(x => x.status < 0);            
       case "-1":
            return query.Where(x => x.status == -1);
       case "-100":
            return query.Where(x => x.status == -100);
       case "1":
       default:
            return query.Where(x => x.status >= 0);
    }
}

这篇关于在LINQ到实体查询动态条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆