4

SQLクエリを直接ビルドする古いコードをEntityFrameworkに変換しようとしていますが、多くの人が抱えていると思われる問題に遭遇しました(そのトピックを取り巻く多数の質問から判断すると):linqで動的なwhere条件を表現する方法。

linqクエリを使用して次のコードを表現するにはどうすればよいですか?

    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";

他の投稿で動的Linq拡張機能について読んだことがPredicateBuilderありますが、のような単純なケースは外部ライブラリがなくても解決できると思います。

.net 4.5、EF 5.0、C#を使用して、単一のケースごとに完全なlinqステートメントを作成せずに、これを「動的」な方法で実行できますか?

4

3 に答える 3

2

あなたの場合、以下のようにPredicateBuilderを利用してください

私のブログ投稿もチェックしてください:Linqを使用した動的クエリ

var outer = PredicateBuilder.True<Entity>();

switch (status) {
        case "0":
            outer = outer.And (p => p.status<0);
            break;
        case "-1":
            outer = outer.And (p => p.status==-1);
            break;
        case "-100":
            outer = outer.And (p => p.status==-100);
            break;
        case "1":
        default:
            outer = outer.And (p => p.status>=0); 
            break;
    }

if (strsearch != "")
        outer = outer.And (p => p.desc.Contains(strsearch ));

dataContext.Entity.Where (outer );
于 2012-11-05T13:52:02.993 に答える
2

外部のものを使用したくない場合は、流暢な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);

ところで、ステータスでフィルタリングするための拡張メソッドを作成できます。そして、クエリは次のようになります。

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

拡張方法:

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);
    }
}
于 2012-11-05T14:12:18.677 に答える
0

LinkExtensionLinqKitで使用できます

  using (var context = new workEntities() )
{

    Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
    dictionary["Title"] = new List<string> {  
                    "Network Engineer", 
                    "Security Specialist", 
                    "=Web Developer"
                };
    dictionary["Salary"] = new List<string> { ">=2000" };
    dictionary["VacationHours"] = new List<string> { ">21" };
    dictionary["SickLeaveHours"] = new List<string> { "<5" };                
    dictionary["HireDate"] = new List<string> { 
                    ">=01/01/2000",
                    "28/02/2014" 
                };
    dictionary["ModifiedDate"] = new List<string> { DateTime.Now.ToString() };

    var data = context.Employee.CollectionToQuery(dictionary).ToList();
}
于 2014-03-02T09:38:44.663 に答える