当前位置:首 页 > 攻城湿 > 查看文章

动态LINQ的几种方法

攻城湿 你是第2479个围观者 1条评论 供稿者: 标签:, , ,

在使用LINQ中,会发现使用很多传统的多条件查询很难实现。

这里提供网上已有的几种方法:

一、用表达式树依据 IQueryable 数据源构造一个动态查询

参见:博客园 李永京http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html

二、使用LINQ动态查询库(Scott提供)

允许你使用接受字符串参数(而不是类安全的语言运算符)的扩展方法来表示LINQ查询。

中文原文:http://blog.joycode.com/scottgu/archive/2008/01/09/113554.aspx

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

下载:

Basic Dynamic LINQ C# Sample
Basic Dynamic LINQ VB Sample

dynamic-linq使用强类型举例:
Dynamic LINQ中的时间比较:

” and insertTime.value.CompareTo(‘” + StartDate.Value + “‘)>=0 and insertTime.value.CompareTo( ‘” + Convert.ToDateTime(EndDate.Value).AddDays(1).ToString() + “‘)< =0"

或者

” and insertTime>=” + DateTime.Parse(StartDate.Value)+ “

Dynamic LINQ中的LIKE:

.Where(“AdminName.Contains(‘a’)”);

生成的SQL语句

SELECT * FROM [dbo].[Admin] AS [t0]
WHERE [t0].[AdminName] LIKE @p0 
 
-- @p0: Input VarChar (Size = 3; Prec = 0; Scale = 0) [%a%] 
 
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1

三、Using PredicateBuilder(Dynamically Composing Expression Predicates)
原文:http://www.albahari.com/nutshell/predicatebuilder.aspx
使用前:

IQueryable<product> SearchProducts (params string[] keywords)
{
  IQueryable</product><product> query = dataContext.Products;
 
  foreach (string keyword in keywords)
  {
    string temp = keyword;
    query = query.Where (p => p.Description.Contains (temp));
  }
  return query;
}
</product>

使用后:

Using PredicateBuilderIQueryable<product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False</product><product>();
 
  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}
</product>

PredicateBuilder 源码:

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
 
public static class PredicateBuilder
{
  public static Expression<func <T, bool>> True<t> ()  { return f => true;  }
  public static Expression<func <T, bool>> False<t> () { return f => false; }
 
  public static Expression<func <T, bool>> Or<t> (this Expression<func <T, bool>> expr1,
                                                      Expression</func><func <T, bool>> expr2)
  {
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<expression> ());
    return Expression.Lambda<func <T, bool>>
          (Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);
  }
 
  public static Expression</func><func <T, bool>> And<t> (this Expression<func <T, bool>> expr1,
                                                       Expression</func><func <T, bool>> expr2)
  {
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<expression> ());
    return Expression.Lambda<func <T, bool>>
          (Expression.And (expr1.Body, invokedExpr), expr1.Parameters);
  }
}
</func></expression></func></t></func></expression></func></t></func></t></func></t></func>
这家伙很懒,什么都没写!

—— zhaorong

zhaorong
你可能也喜欢Related Posts
众说纷纭Comments
大眼 可爱 大笑 坏笑 害羞 发怒 折磨 快哭了 大哭 白眼 晕 流汗 困 腼腆 惊讶 憨笑 色 得意 骷髅 囧 睡觉 眨眼 亲亲 疑问 闭嘴 难过 淡定 抗议 鄙视 猪头
小提示:直接粘贴图片到输入框试试
努力发送中...
  1. 1 楼 访客

    ,最了解你的人有时不是你的朋友,而是你的敌人

    2014年01月28日 03:34:10 回复 取消回复
  • 评论最多
  • 最新评论
  • 随机文章
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容
Copyright © zhaorong All Rights Reserved. 滇ICP备15006105号-1