Hello World
Spiga

扩展LINQ to SQL:使用Lambda Expression批量删除数据

2008-03-05 13:01 by 老赵, 31499 visits

ORM框架在删除数据方面一直有个尴尬,那就是无法通过指定条件批量删除数据(当然这本不是ORM的问题,只是使用上感觉不方便)。于是对于一些删除操作,我们不得不写SQL语句或者执行存储过程,例如:

ItemDataContext db = new ItemDataContext();
db.ExecuteCommand(
    "DELETE FROM Item WHERE [CreateTime] < {0}",
    DateTime.UtcNow.AddMonths(-1));

我始终认为,在程序里出现直接的SQL语句是一件很丑陋的事情。在我看来,数据库操作应该被封装起来,而对于应用层的开发人员来说,眼中应该只有对象——退一步的话也可向数据库发送指令(就是使用存储过程)。当然,这是理想状态,值得追求,但不可强求。幸运的是C# 3.0所拥有的强大特性足以让我们对LINQ to SQL的功能进行扩展。为了更好地进行项目开发,以及周五的一次技术交流,我为LINQ to SQL扩展了批量删除功能。当项目中引用了这个扩展之后,我们就可以使用如下的代码来实现上面的功能了:

ItemDataContext db = new ItemDataContext();
db.Items.Delete(item => item.CreateTime < DateTime.UtcNow.AddMonths(-1));

当然,扩展还支持更复杂的删除条件,例如:

ItemDataContext db = new ItemDataContext();
db.Items.Delete(item =>
    item.CreateTime < DateTime.UtcNow.AddMonths(-1) ||
    item.ViewCount < item.CommentCount && item.UserName != "jeffz"); 

之前我对于LINQ to SQL的扩展大都基于DataContext,不过很明显,这次的扩展是基于Table<T>的。总的来说,这个扩展比我想象中要简单不少。针对LINQ的扩展最麻烦的地方就在于解析表达式树(Expression Tree),而这个扩展关键的就是二元表达式(BinaryExpression),除了这点就没有太大问题了——当然,这也是因为我放弃了对于复杂表达式树的解析,例如现在就不支持“item.Introduction.Length < 10”这种条件,而对于更完整的解析方式来说,应该将其转化为T-SQL中的LEN函数。

这个扩展的关键在于根据表达式树生成Where Condition,我使用三个步骤完成这个扩展,大家可以关注代码里的相关实现(如果需要的话我也可以在以后进行说明):

  1. 使用PartialEvaluator将表达式中的常量直接计算出来(例如“3 * 3”表达式将被替换为“9”),同时也会将一些存储在变量中的值使用常量进行替换。
  2. 使用ConditionBuilder将表达式中的常量收集起来,并生成带参数的Condition表达式(例如“[CreateTime] < {0} AND [UserName] <> {1}”)。
  3. 使用DataContext.ExecuteCommand方法执行完整的SQL语句。

有了批量删除的功能,那么还缺点什么呢?那自然就是批量更新的功能了。批量更新的功能比删除略为复杂一些,我正在开发之中。在有了这个扩展之后,我们就可以使用如下的方法进行批量更新了:

ItemDataContext db = new ItemDataContext();
db.Items.Update(
    item => new Item
    {
        Introduction = item.Title + "Hello World",
        ViewCount = item.ViewCount + 1,
    }, // 更新方式
    item => item.CommentCount > 100 /* 更新条件 */);

您可以点击这里下载我对批量删除的扩展。

本文的英文版本

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

75 条回复

  1. Q.Lee.lulu
    *.*.*.*
    链接

    Q.Lee.lulu 2008-03-05 13:03:00

    坐了沙发再看!!

  2. 老赵
    admin
    链接

    老赵 2008-03-05 13:04:00

    @Q.Lee.lulu
    哥们你动作也太快了。

  3. kiler
    *.*.*.*
    链接

    kiler 2008-03-05 13:12:00

    用sql确实丑陋,支持这种用法,顺便问问这种方式能不能实现类似 IN 和 Like的功能呢?

  4. 5254341[未注册用户]
    *.*.*.*
    链接

    5254341[未注册用户] 2008-03-05 13:14:00

    座板凳上看看。关注研究LINQ很久鸟

  5. 簡簡單單..
    *.*.*.*
    链接

    簡簡單單.. 2008-03-05 13:16:00

    ...

  6. 韩现龙
    *.*.*.*
    链接

    韩现龙 2008-03-05 13:16:00

    我要努力了。最近有些偷懒~那本书得抓紧时间译完

  7. 老赵
    admin
    链接

    老赵 2008-03-05 13:45:00

    @kiler
    只要Lamda Expression在语法上能表达就没有问题。

  8. ccBoy_ccBoy[未注册用户]
    *.*.*.*
    链接

    ccBoy_ccBoy[未注册用户] 2008-03-05 15:27:00

    不错, L2S还是耦合性太强,这仅仅比以前的编程提前和方便了一步,编程语言的方便性展现了,但从架构上,没有更多的进步。

    EF能从更高的一个层次来平衡两者,比如产生业务的EDM和业务相关的Lamda Expression,这可能是我们不懈追求和喜欢的方式。呵呵

  9. 啊啊啊[未注册用户]
    *.*.*.*
    链接

    啊啊啊[未注册用户] 2008-03-05 15:56:00

    哥们你太强了。上次看了你的关于修改sQl语句的扩展,感觉非常好。

  10. xingd
    *.*.*.*
    链接

    xingd 2008-03-05 16:30:00

    等周五的时候听你讲这个,正好也是我计划要做的。

    08年内我对这个主题会不断做一些探索,计划会替换全部的L2S实现,或者是间接调用L2S中的Expression Tree解析,目的是把多数据库、MemCached和全文检索统一集成到LINQ语法中,通过Attribute,减少应用开发人员对低层细节的关注,提高开发效率。

    这个事情的优先级非常低,因为毕竟网站目前运行良好,开发人员也已经能够很熟练的使用MemCache客户端,实现之后只是能供提高开发效率、代码可读性和可维护性。

    不过我们Team中几位同事对我的这个项目都感兴趣,所以这件事情应该还是会推动去做的,对大家的开发水平提高也都有帮助。

  11. 随风流月
    *.*.*.*
    链接

    随风流月 2008-03-05 16:47:00

    @xingd
    直接扩展 LINQ 算了。LINQ to SQL 有其局限性。另外,不知道您关注过 Linq to Entites 吗?

  12. xingd
    *.*.*.*
    链接

    xingd 2008-03-05 16:50:00

    @随风流月
    前面我说的只是理想状态,具体的实现要经过一些探索也能决定。

  13. 老赵
    admin
    链接

    老赵 2008-03-05 16:52:00

    @xingd
    如果能够实现一个可扩展的数据访问框架,应该是一个比较有前途的项目,到时候记得叫上我,赫赫。
    不过微软也正在推Entity Framework,NHibernate也有LINQ to NHibernate,如果要一个通用的话,一定要做的比它们有优势才行。

  14. 老赵
    admin
    链接

    老赵 2008-03-05 16:53:00

    @随风流月
    扩展LINQ是什么意思?

  15. xingd
    *.*.*.*
    链接

    xingd 2008-03-05 17:22:00

    @Jeffrey Zhao
    Entity Framework和LINQ to NHiberante都不会针对Web 2.0网站的一些特点作优化的,这就是为什么我计划要自己做一些实现。

    具体要做的时候,要参考EntLib 4.0, IIS 7和SQL Server 2008的功能,所以目前还只是计划阶段。我在看SQL 2008,酒精在看IIS 7,要过一段时间才会启动这个项目。

  16. 随风流月
    *.*.*.*
    链接

    随风流月 2008-03-05 17:38:00

    @Jeffrey Zhao
    直接实现一个 LINQ to XXX。

  17. xingd
    *.*.*.*
    链接

    xingd 2008-03-05 17:44:00

    @随风流月
    这两天老赵的MSN签名就是"LINQ to Everything"。

    我的意思跟你说的一样,自己解析编译器生成的LINQ表达式树,实现缓存和分布数据库的支持。

  18. 老赵
    admin
    链接

    老赵 2008-03-05 17:59:00

    @随风流月
    这个我知道,我刚才以为“扩展LINQ”的意思是改变LINQ机制本身,比如多加一个操作等等,赫赫。

  19. 老赵
    admin
    链接

    老赵 2008-03-05 18:01:00

    @Jeffrey Zhao
    我在看SQL 2008,酒精在看IIS 7,要过一段时间才会启动这个项目。
    --------------------------------------------------------
    tmd,你们的资源真好,到时候我要来坑蒙拐骗……

  20. J. Lin
    *.*.*.*
    链接

    J. Lin 2008-03-05 18:31:00

    是不是应该把这些放在一个manage类里实现,个人觉得根据Linq-to-Sql 的设计Table 或者Entity(row) 是不应该有SAVE/DELETE 功能的。

    另外事务也是一个问题,如果用DataContext.SubmitChanges()是会自动应用事务的,ExecuteCommand则没有。当然这实现起来也不难。

    是不是能把这些功能做到SubmitChanges里去内呢?或许扩展一个自定义的DataContext是一种可能实现的方法。仅供参考

  21. 老赵
    admin
    链接

    老赵 2008-03-05 20:38:00

    @J. Lin
    现在的扩展其实是一个辅助方法,而不是结合入LINQ to SQL的操作。
    ExecuteCommand因为只执行一条语句,所以也是事务的。
    结合SubmitChanges也不是不可以,可以在子类中override父类的SubmitChanges方法,在同一事务中提交,其实这些倒都不难,赫赫。

  22. sunny1[未注册用户]
    *.*.*.*
    链接

    sunny1[未注册用户] 2008-03-07 13:02:00

    请问一下,对于大型的网站来说,ORM适合吗(例如:NHibernate),SQL语句都是动态生成,这样会影响网站的性能码?

  23. 老赵
    admin
    链接

    老赵 2008-03-07 13:24:00

    @sunny1
    个人认为没有问题,性能瓶颈一般不会在创建SQL字符串上。

  24. sunny1[未注册用户]
    *.*.*.*
    链接

    sunny1[未注册用户] 2008-03-07 13:29:00

    请问一下,你现在做的网站用了ORM吧

  25. 老赵
    admin
    链接

    老赵 2008-03-07 13:37:00

    @sunny1
    用了

  26. U2U
    *.*.*.*
    链接

    U2U 2008-03-09 00:53:00

    提供原生态的SQL语句支持,无论Select或者是Delete等,微软已经实现了,作为一个扩展包,命名空间是Linq.Dynamic,强大地让你惊讶,主要思路是分析并且构建语法树。所以提醒Jeffrey不需要做重复的劳动,呵呵

  27. yjmyzz@126.com[未注册用户…
    *.*.*.*
    链接

    yjmyzz@126.com[未注册用户] 2008-03-09 14:39:00

    ctx.T_Products.Delete(p => p.F_Name.Contains("oo"));

    我用这行试了下(想删除T_Products中F_Name包含"oo"的记录),编译无错,但运行时报异常:

    An expression of non-boolean type specified in a context where a condition is expected, near '@p0'.

  28. 老赵
    admin
    链接

    老赵 2008-03-09 14:52:00

    @yjmyzz@126.com
    文章里说了,不支持复杂的条件。

  29. 老赵
    admin
    链接

    老赵 2008-03-09 14:54:00

    @U2U
    赫赫,Dynamic Linq我自然了解。不过请注意您也说了Dynamic Linq的作用是字符串到Expression Tree的构建。
    而我做的是Expression Tree的解析。
    另外Dynamic Linq支持的是LINQ,而不是LINQ to SQL,更不是什么“原生态”SQL语句支持了——因为这种所谓的SQL支持,都是指Expression Tree的解析,而不是Dynamic Linq提供的Expression Tree生成功能。

  30. 老赵
    admin
    链接

    老赵 2008-03-09 14:57:00

    @U2U
    发现大家有点把LINQ和Lambda Expression混淆起来了。
    LINQ的最后一个字是Query,也就是指“查询”,是指如下代码:
    from a in xxxx where ... order by ... select ...
    或者是:
    xxx.Where(...).Select(...)

  31. 光影传说
    *.*.*.*
    链接

    光影传说 2008-03-13 20:27:00

    @xingd
    这也是偶正想做的,把我的ORM换成用Linq实现,现在一直没有这个时间,前段时间主要是把客户端的代理实现重构了一下。如果下面有时间的话,我首先要做的第一件事,就是把DTO的级联触发再完善一下,第二件事就是把ORM换成用Linq实现,不会用MS的Linq TO SQL,应用的时候有太多限制了,特别是在业务逻辑层组织。

  32. Cat Chen
    *.*.*.*
    链接

    Cat Chen 2008-03-13 23:14:00

    其实就是lamda,只要有lamda就很灵活,最好再加上闭包,如果GC能够处理的话。

  33. Cat Chen
    *.*.*.*
    链接

    Cat Chen 2008-03-13 23:14:00

    另外,能否加上更多实现细节?我懒得下载代码去看,咔咔~

  34. 老赵
    admin
    链接

    老赵 2008-03-14 16:12:00

    @光影传说
    LINQ to SQL的限制在哪里呢?

  35. xyz123[未注册用户]
    *.*.*.*
    链接

    xyz123[未注册用户] 2008-03-14 22:06:00

    什么时候有Update的啊?

  36. 老赵
    admin
    链接

    老赵 2008-03-14 23:16:00

    @xyz123
    最近事情多的可怕,我要傻掉了,朋友们等一下吧……

  37. 光影传说
    *.*.*.*
    链接

    光影传说 2008-03-17 12:16:00

    @Jeffrey Zhao
    就是在对于Table的返回,以及状态的处理,这些方面。
    我感觉在业务层里面,不应该处理或者涉及到Table<>之类的东东,而是应该是一个普通的数组,数据应该是相对独立的,不然与Table或者Context的耦合太紧密,不利于业务逻辑的组织。ORM层就是负责ORM,不能再把业务逻辑也放在一起。在数据层可以存在表的概念,但在业务层不应该再出现类似于表的概念在里面。
    对于客户端的数据绑定不应该与Table相关,数据也应该是相对独立的。包括绑定、触发、更新等。也不应该再出现表的概念在里面,客户端只与业务层或服务层相关。不管是BS还是CS,应该都是类似的。客户端应该只是薄薄的一层,封闭了对于外观的展现。

  38. 老赵
    admin
    链接

    老赵 2008-03-17 14:55:00

    @光影传说
    你说的没错,不过LINQ to SQL并没有什么问题啊,LINQ to SQL只是获取数据,最终业务逻辑就在操作其他数据结构了,比如List等等。

  39. 光影传说
    *.*.*.*
    链接

    光影传说 2008-03-17 18:55:00

    @Jeffrey Zhao
    这种思想,对于纯BS的应用,没有应用服务器的应用,这样的思想可以发挥出来,但是对于有应用服器的应用,就要多考虑考虑了。要么就多一些特殊的处理,当然,这些都是相对的。

  40. 老赵
    admin
    链接

    老赵 2008-03-17 22:37:00

    @光影传说
    没有觉得有什么区别。
    把LINQ to SQL看作是数据访问层的实现技术即可,例如用它来替代ADO.NET。当然它ORMapping不太灵活的确是一个问题,但是对于大部分应用已经够了——而且此类应用基本上都不会有应用服务器,就像大部分互联网应用一样。

  41. 光影传说
    *.*.*.*
    链接

    光影传说 2008-03-18 00:39:00

    @Jeffrey Zhao
    对于这样的应用是足够了,是非常方便的,不会有什么问题的,主要是应用场景不同。我感觉与ADO.Net的思想倒是有很多相似的地方。

  42. 老赵
    admin
    链接

    老赵 2008-03-18 00:56:00

    @光影传说
    LINQ to SQL实际上完全可以基于ADO.NET实现出来,至于思想上——ADO.NET是什么思想呢?DataTable,DataSet,离线数据集?没有看出相似点在什么地方……

  43. 光影传说
    *.*.*.*
    链接

    光影传说 2008-03-18 10:43:00

    @Jeffrey Zhao
    呵呵。Table<>;与DataTable。
    DataTable是支持绑定处理的,以数据为中心的。
    Table<>也支持绑定,也是以数据为中心的。绑定数据的变化也是记录在Table<>里面的。
    对于远程应用:ADO.net常用的数据传输是以DataTable传输,而Linq TO SQL 也是以Table<>;传输的。这里或多或少都是有非常多的相似的地方。Table<>;也可以以List<>;等其他方式传输,但是客户端的绑定,却会出现一些其他引起的问题,灵活性不足。重写绑定机制当然也可以,但是这就不是纯正的MS提供的架构了。在Table<>与业务逻辑层的与服务层、客户端没有提供松散的处理机制或思想,与DataTable的处理思想是类似的。
    这只是我的感觉,表达的不一定正确。

  44. 老赵
    admin
    链接

    老赵 2008-03-18 12:14:00

    @光影传说
    不敢苟同。Table只是一个实体集合而已,和DataTable从操作和功能上都大相径庭,更不是以数据为中心的架构了。
    不如谈一下你希望是个什么样的架构吧,我一直不知道LINQ to SQL为什么不满足你的需求。

  45. 光影传说
    *.*.*.*
    链接

    光影传说 2008-03-18 18:06:00

    希望的架构,一句话可能说不清楚。
    我希望的架构应该是经典的三层构架:数据库层/应用服务层/客户端
    客户端提供数据的双向绑定:要求数据是自治的,基于事件触发的。

  46. 老赵
    admin
    链接

    老赵 2008-03-18 18:33:00

    @光影传说
    还是没有理解,呵呵。能不能举一个现有的框架作为例子呢?各领域的技术都可以。

  47. 光影传说
    *.*.*.*
    链接

    光影传说 2008-03-19 17:18:00

    @Jeffrey Zhao
    主要是我在完善自己框架中间遇到的一些问题,用现在MS提供的架构不容易实现,感觉灵活性不够吧。
    这个如果有机会一起坐下来聊聊倒是不错的。
    在这里写,要写的太多了。

  48. songcan
    *.*.*.*
    链接

    songcan 2008-03-21 01:11:00

    赵老师好,问两个与主题无关的问题,请原谅!请问AJAX中UPDATEPANEL外的控件怎样更新UPDATEPANEL里面的控件的值?第二个就是在同一UPDATEPANEL有一个checkbox和textbox的两个控件,checkbox设为自动回发,当textbox里有值时,更改checkbox的选中状态时,textbox里面的字串变为乱码,随着不断更改checkbox的选中状态的操作的进行,textbox里面的字串越来越长且都为乱码,请问该如何解决?谢谢!

  49. 老赵
    admin
    链接

    老赵 2008-03-21 11:35:00

    @songcan
    UpdatePanel里设AsyncPostBackTrigger。至于乱码问题,你在checkbox里做什么了吗?

  50. songcan
    *.*.*.*
    链接

    songcan 2008-03-21 13:42:00

    谢谢赵老师!我什么操作也没做,只是checkbox的回发就导致了这个问题的发生,就我所知 ,一些人也碰到这个问题,都没有解决,感觉这个问题很让人郁闷

  51. 老赵
    admin
    链接

    老赵 2008-03-21 14:11:00

    @songcan
    乱码一般总是编码问题造成的,检查所有的页面是不是都是utf-8编码的。

  52. 江大鱼
    *.*.*.*
    链接

    江大鱼 2008-03-24 18:34:00

    有没有ActiveRecord这样的sample阿?

  53. 老赵
    admin
    链接

    老赵 2008-03-24 22:25:00

    @江大鱼
    ActiveRecord没有在LINQ to SQL中实现过,不过可以略为改造一下,呵呵。

  54. 任飞扬
    *.*.*.*
    链接

    任飞扬 2008-04-25 15:36:00

    问一个linq to sql的问题:
    2个表: zj_tccq zj_btc; 是一对多的关系
    zj_tccq cq = FindOne...(id);
    而cq.zj_btc的值为null, 为什么啊

  55. 工作台[未注册用户]
    *.*.*.*
    链接

    工作台[未注册用户] 2008-06-01 19:31:00

    cq.zj_btc的值为null 我也不知道为什么,问问老赵吧

  56. yypt111[未注册用户]
    *.*.*.*
    链接

    yypt111[未注册用户] 2008-06-19 11:49:00

    你的实例代码似乎是在 Vs2008 Relase发布之前的,已经早就过期了,怎么现在想起来贴上去?

  57. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2008-08-03 08:35:00

    俺好落伍呀,.net 3.0的东西P也不懂呢。

  58. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2008-08-03 08:37:00

    怀念前年冬天去广西出差的时候每晚都来看老赵的ajax文章,呵呵。

  59. 老赵
    admin
    链接

    老赵 2008-08-03 23:36:00

    --引用--------------------------------------------------
    蛙蛙池塘: 俺好落伍呀,.net 3.0的东西P也不懂呢。
    --------------------------------------------------------
    如果不用LINQ那可是大大降低了生产能力阿,赫赫。

  60. yzlhccdec
    *.*.*.*
    链接

    yzlhccdec 2008-08-06 10:52:00

    貌似EF不支持DML?

  61. xuesky
    *.*.*.*
    链接

    xuesky 2008-11-26 10:16:00

    问下楼主,像如何用Linq处理如下的删除与更新语句
    delete from sys_Role where RoleID in (1,2,3,4,5)
    update set RoleName = 'Admin' where RoleID in(1,2,3,4,5)

    还有以下之类的语句
    insert Role Role(RoleID,RoleName)
    select 1,'Admin' union all
    select 2,'Guest' union all
    select 3,'Guest1'

  62. 老赵
    admin
    链接

    老赵 2008-11-26 10:28:00

    @xuesky
    LINQ to SQL可以用Contains的

  63. xuesky
    *.*.*.*
    链接

    xuesky 2008-11-26 13:34:00

    谢谢老赵,有机会跟你多学习学习,呵

  64. 老赵
    admin
    链接

    老赵 2008-11-26 13:49:00

    @xuesky
    客气了

  65. ^&^roping
    *.*.*.*
    链接

    ^&^roping 2009-06-02 23:24:00

    Jeffrey Zhao :

    您好,你写的关于LINQ系列的文章很有深度,想向你请教一个问题:
    你目前代码例子都是用连接方式的DataContext进行开发,如果采用
    断开DataContext方式开发L2S开发,如何做?

  66. vanoin
    *.*.*.*
    链接

    vanoin 2009-08-09 19:37:00

    哈哈,很欣赏博主的个人简介

  67. 勇赴
    *.*.*.*
    链接

    勇赴 2009-08-26 16:13:00

    Entity Framework里面也没有批量删除的方法,看了老赵的文章,下载了老赵的源代码,改了一个EF的批量删除,别说我盗版啊,哈哈
    public static int Delete<TEntity>(this ObjectQuery<TEntity> query, Expression<Func<TEntity, bool>> predicate)
    where TEntity : EntityObject
    {
    IEnumerable<TEntity> tes = query.Where(predicate);
    foreach (var te in tes)
    {
    query.Context.DeleteObject(te);
    }
    return query.Context.SaveChanges();
    }
    调用方式和老赵一样

  68. netguid
    222.210.181.*
    链接

    netguid 2010-10-09 16:21:07

    老赵,你的Update扩展出来没得

  69. 老赵
    admin
    链接

    老赵 2010-10-09 16:42:30

    @netguid

    出来五百年了,都不知道丢到哪里去了。

  70. 老蒋
    125.107.29.*
    链接

    老蒋 2011-01-23 15:57:41

    刚开始用Linq to sql,请教一个问题。我看大家对这个扩展或其他类似的扩展的使用都是这样说的:

    ItemDataContext db = new ItemDataContext();
    db.Items.Delete(item => item.CreateTime < DateTime.UtcNow.AddMonths(-1) || item.ViewCount < item.CommentCount && item.UserName != "jeffz"); 
    

    可我看了源码觉得应该是这样的:

    TableExtensions.Delete<Items>(Items, item=> item.CreateTime.....);
    

    是我搞错了吗?请赐教。

  71. 老赵
    admin
    链接

    老赵 2011-01-23 16:02:35

    @老蒋

    我很奇怪你知道Lambda表达式居然不知道扩展方法,呵呵。

  72. 老蒋
    125.107.29.*
    链接

    老蒋 2011-01-23 16:15:33

    谢谢,搜索了一下“linq 扩展方法”找到资料了。原来一直google “linq extensions"没找到资料。

  73. rqx
    60.190.43.*
    链接

    rqx 2011-12-21 16:34:44

    "Update扩展 出来五百年了,都不知道丢到哪里去了。" 请问要去哪下载呢?

  74. 假面
    183.62.9.*
    链接

    假面 2012-03-01 09:26:46

    老赵能否拓展支持更复杂的 查询 比如 like in 这几个拓展貌似很必要,自己拿着你的代码试着拓展,无奈很不动表达式树。

  75. fly
    114.66.5.*
    链接

    fly 2012-09-14 09:10:59

    item.Name.Contains("jeffz")

    或者 List list = new List() { "jeffz","老赵"};

    list.Contains(item.Name)

    这样能怎么支持一下吗?

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我