Linq动态查询与模糊查询(带源码示例)

最近有个项目用Linq做的,有个复合搜索模糊查询的功能,有点麻烦,绕了好几个弯,最后是解决了,在这里分享一下我的处理过程,如果大家有更好的办法也请给我介绍一下。我用Linq还不熟,好多东西边查资料边做的。

 

应用场景如下图,多条件复合搜索,很常见吧(但Linq搞这个还真是麻烦):

 

阶段一:

首先是找到了李永京(YJingLee)前辈的《LINQ体验(17)——LINQ to SQL语句之动态查询》一文,利用Lambda表达式树可以进行动态查询。

写了个方法进行复合查询,动态组合条件,生成Lambda表达式。

 

Code

 

搞了半天本来很兴奋的,之后才知道Lambda表达式是写不出.Contains()的,我的心瓦凉瓦凉的。

 

阶段二:

虽然李永京的文章没给我多少帮助,但它后面有个回复很有价值:“用微软提供的System.Linq.Dynamic方便点。”

很快找到了对应例子和Dynamic.cs,也找到了《Linq to SQL Dynamic 动态查询》,有更细致的例子,可惜Dynamic.cs也是不能使用like的,恨啊!

 

Code

代码很容易,但没什么用:(

 

阶段三:

中文的实在是找不到了,在MS的官方BBS上找到了个链接,非常有用!《dynamic linq queries / dynamic where clause (part 2) 》,这个老外扩展了Dynamic.cs,写了个PredicateExtensions类,虽然不知道他是怎么想出来的,但确实有效!

这里放出核心代码,很容易看懂,简单就是美! 

Code

 

下面是我写了注释后的PredicateExtensions,我说不清楚构造函数的True和False具体是怎么起作用的,但结果就是我的注释那样,在复合查询写条件时很重要(不过目前全写AND就完成复合查询了,我还没搞多关键词OR的那种):

Code

 

附带完整源代码示例

posted @ 2008-08-03 20:26 肖坤 阅读(12379) 评论(49) 编辑 收藏

 回复 引用 查看   
#1楼2008-08-03 20:41 | zeus2      
模糊查询不能使用Contains嘛。

多条件 多加几个WHere条件吧。

 回复 引用 查看   
#2楼2008-08-03 20:43 | Desmend      
哎,很想学习下啊,现在没时间
 回复 引用   
#3楼2008-08-03 20:56 | zhengming[未注册用户]
from u in Consulting.Instance.UserT_TractInfo
where u => u.B_number.Contains(condition) &&
u => u.B_address.Contains(condition) &&
u => u.B_canton.Contains(condition);
有区别吗?

 回复 引用 查看   
#4楼2008-08-03 21:00 | 真见      
你这个图片也够强的。
 回复 引用 查看   
#5楼2008-08-03 21:59 | 深蓝      
好复杂的代码,我眼睛要花了@_@
 回复 引用 查看   
#6楼2008-08-03 22:14 | 金色海洋(jyk)      
好像Linq并不太适合做动态查询呀。

我觉得可以放在首页的,支持。


 回复 引用 查看   
#7楼2008-08-03 23:21 | 荔橙伊珊雨      
呵呵.支持.
 回复 引用   
#8楼2008-08-04 09:08 | violet250[未注册用户]
啥的。。。多几个WHERE 方法 会自动加上条件的。。估计楼主还没很好了解Linq运作方式
 回复 引用 查看   
#9楼2008-08-04 09:48 | 杨义金      
这种查询方法太麻烦了,不好控制。

还是像HQL 这种查询语言好用点。

 回复 引用   
#10楼2008-08-04 10:34 | 欧阳西风[未注册用户]
@violet250
这里有个问题,当最终用户可能用一个条件,也可能用全部条件时,语句并不同,而这个组合非常多时,你怎么办...并不是你简单的加几个where,要不然楼主也不用费劲写这个东西了.

 回复 引用 查看   
#11楼2008-08-04 14:17 | SZW      
Linq 里面的Contains要反过来用,不过不是用在模糊查询上,是批量查询
 回复 引用 查看   
#12楼[楼主]2008-08-04 22:28 | 肖坤      
也许我这里的例子看不到它和WHERE的区别,不过请注意我外层使用的是foreach,它的条件数量是不固定的,而且它可以做到子条件中使用OR进行多关键词的查询,这个用传统的LINQ就很难做到了。
灵活性还是相当可观的。

 回复 引用   
#13楼2008-08-05 13:58 | ico[未注册用户]
痛頭的很呀!linq沒有多表關聯,動態條件查詢目前還沒有很好的解決方案.所以我個對他沒辦法了,我的建議到把他寫在存儲過程裡,然後用linq調用存儲過程,但這個冶標不冶本,期待樓主能給我們帶來更好的文章!
 回复 引用 查看   
#14楼[楼主]2008-08-06 18:25 | 肖坤      
@ico
如果还是要用存储过程,那干脆还是用CodeSmith生成DAL,全部回归传统吧。。。用LINQ不就是看中它的“美观大方”吗

 回复 引用 查看   
#15楼2008-08-26 16:39 | Alex.XL      
我也刚刚才开始研究LINQ的相关的东西.
看了你的文章.然后自己又研究了下.
发现你说的阶段一和阶段二也可以实现string.Contains()的方法的.代码如下.

NorthwindDataContext d = new NorthwindDataContext();
//linq
var cas = from s in d.Categories
where s.CategoryID > 1 && s.CategoryName.Contains("Con")
select s;

Response.Write("LinQ:<br/>");
foreach (Categories c in cas)
{
Response.Write(string.Format("{0}:{1}<br/>", c.CategoryID, c.CategoryName));
}

//linq.Dynamic
List<Categories> li = d.Categories.Where("CategoryID > 1 and CategoryName.Contains(\"Con\")").ToList();

Response.Write("<br/>Dynamic LinQ:<br/>");
foreach(Categories c in li)
{
Response.Write(string.Format("{0}:{1}<br/>", c.CategoryID, c.CategoryName));
}


//Expression Tree
IQueryable<Categories> categories = d.Categories;
//构造 s => s.CategoryID > 1 && s.CategoryName.Contains("Con")
ParameterExpression param = Expression.Parameter(typeof(Categories), "s");
//选择s.CategoryID
Expression selector = Expression.Property(param, typeof(Categories).GetProperty("CategoryID"));
//组合条件 s.CategoryID > 1
Expression FirstCondition = Expression.GreaterThan(selector, Expression.Constant(1, typeof(int)));

//组合条件 s.CategoryName.Contains("Con")
Expression SecondCondition = Expression.Call(
Expression.Property(param, typeof(Categories).GetProperty("CategoryName"))
, typeof(string).GetMethod("Contains")
, Expression.Constant("Con", typeof(string)));
//组合条件 s.CategoryID > 1 && s.CategoryName.Contains("Con")
Expression Condition = Expression.And(FirstCondition, SecondCondition);
Expression pred = Expression.Lambda(Condition, param);
//调用Where
Expression expr = Expression.Call(typeof(Queryable), "Where",
new Type[] { typeof(Categories) },
Expression.Constant(categories), pred);
li = d.Categories.AsQueryable()
.Provider.CreateQuery<Categories>(expr).ToList();

Response.Write("<br/>Expression Tree:<br/>");
foreach (Categories c in li)
{
Response.Write(string.Format("{0}:{1}<br/>", c.CategoryID, c.CategoryName));
}
如果有什么不对,请见谅.我也是个新手.

 回复 引用 查看   
#16楼2008-08-26 16:54 | Alex.XL      
忘记写输出了..
用的是SQL SERVER里面的自带库-Northwind.
下面是上面代码的输出
--------------------------
LinQ:
2:Condiments
3:Confections

Dynamic LinQ:
2:Condiments
3:Confections

Expression Tree:
2:Condiments
3:Confections


 回复 引用 查看   
#17楼[楼主]2008-08-26 17:32 | 肖坤      
@Alex.XL

这个方法是可以的,但好象还做不到多条件组合的查询。



我的主要目标是,在查询条件的关键词、数量都不确定的时候,可以有一种较优美的方法实现,而不必搞一大段if{}else if{}else if{}else{}这样的语句出来。



我查询的环境是,通过类似

/search.aspx?b_number=p&b_canton=%行政区&a_status=4&b_area=片区&c_clinchdate=2006&order=UnitPrice

这样一次传N个不同字段名的参数来动态实现复合查询,传统的组合SQL语句也有些判断语句的,而且条件越多就越难以进行测试。我的这篇POST意义就是说明我自己是如何解决这个问题的。

 回复 引用 查看   
#18楼2008-08-26 18:09 | Alex.XL      
@肖坤
哦..原来如此..
不过.那么长的SWITCH语句...
也可以进行继续优化把.

 回复 引用 查看   
#19楼[楼主]2008-08-28 09:17 | 肖坤      
@Alex.XL
switch里每个case中只有2条语句,很美了:)

 回复 引用   
#20楼2008-09-04 10:03 | -可乐[未注册用户]
请问nvcParam是不是二位数组,我是LINQ新学者,楼主能不能把完整的例子贴上来啊,谢谢了
 回复 引用 查看   
#21楼[楼主]2008-09-04 12:19 | 肖坤      
@-可乐
nvcParam是NameValueCollection类型,是键值对的一种,用它可以传递key和value,你可以查查相关的信息

 回复 引用 查看   
#22楼2008-10-21 13:10 | XHero Liu      
正做呢,从楼主这借点经验...
 回复 引用   
#23楼2008-12-02 10:46 | panpeng[未注册用户]
--引用--------------------------------------------------
-可乐: 请问nvcParam是不是二位数组,我是LINQ新学者,楼主能不能把完整的例子贴上来啊,谢谢了
--------------------------------------------------------

 回复 引用   
#24楼2008-12-11 20:38 | dony[未注册用户]
ExameThemeDataContext lDB = new ExameThemeDataContext();
List<Model.ET_COURSE_MSTR> lList = new List<Model.ET_COURSE_MSTR>();
var lLqList = lDB.ET_COURSE_MSTR.Where(condition).Select("New(vcCOURS_CODE,nvcNAME,nvcDESC,nvcPUBLISH,vcREG_CODE,vcUSER_ID,dtDO_TIME)").GetEnumerator();

while (lLqList.MoveNext())
{
Model.ET_COURSE_MSTR lModel = new Model.ET_COURSE_MSTR();
ET_LINQ.ET_COURSE_MSTR lLqModel = (ET_LINQ.ET_COURSE_MSTR)lLqList.Current;
lModel.vcCOURS_CODE = lLqModel.vcCOURS_CODE;
lList.Add(lModel);
}

无法将类型为“DynamicClass1”的对象强制转换为类型“ET_LINQ.ET_COURSE_MSTR”。

 回复 引用 查看   
#25楼2008-12-11 21:01 | 木刀      
太复杂了。。。。我的想法可能是比较简单,但是我想肯定会有人更愿意用我这种方法的:
var rs=from p in ... select new{p.C1,p.C2};
//假定有两个文本框
if(txt1.Text!="")
rs=rs.Where(p.C1.Contains(txt1.Text));
if(txt2.Text!="")
rs=rs.Where(p.C2==txt2.Text);

更多的动态条件也是一样。 其中contains 会被翻译成like。

 回复 引用   
#26楼2009-01-11 16:31 | blfr[未注册用户]
rs.Where(p.C1.Contains(txt1.Text));
其中p.C1为变量要怎么写啊?即列名为变量

 回复 引用 查看   
#27楼[楼主]2009-01-13 09:11 | 肖坤      
@blfr
如果列名想为变量,用我的方法用switch,或者用"Lambda表达式树"来做,也是类似的方法.另外有个有点龊的办法就是直接用DataContext执行SQL语句,那个办法可以搞定一切.

 回复 引用   
#28楼2009-01-18 11:13 | blfr[未注册用户]
谢谢楼主的回答,太深奥了!楼主还能把三个方法的关键代码写一下啊?小弟困扰数月了!
如:列名由dropdownlist控件决定,另一dropdownlist控件显示选择的列下的值,这样来查找!
望不吝赐教!!

 回复 引用   
#29楼2009-01-19 14:09 | 张文奇[未注册用户]
@blfr
我根据楼主的例子,制作了个简单的,表中有3个字段NewsID,NewsTitle,NewsCategory,具体代码如下,希望对你有所帮助:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Linq.Expressions;
using System.Linq.Dynamic;
using NewsInfo;
public partial class ocx_search_table : System.Web.UI.UserControl
{
Expression<Func<NewsInfo.NewsInfo, bool>> searchPredicate;
protected void Page_Load(object sender, EventArgs e)
{
NameValueCollection nvcParam = new NameValueCollection(Request.QueryString);
searchPredicate = PredicateExtensions.True<NewsInfo.NewsInfo>();
foreach (string key in nvcParam)
{
string condition = string.Empty;
switch (key)
{
case "NewsID":
condition = nvcParam[key];
searchPredicate = searchPredicate.And(u => u.NewsID.ToString().Contains(condition));
break;
case "NewsTitle":
condition = nvcParam[key];
searchPredicate = searchPredicate.And(u => u.NewsTitle.Contains(condition));
break;
case "NewsCategory":
condition = nvcParam[key];
searchPredicate = searchPredicate.And(u => u.NewsCategory.ToString().Contains(condition));
break;
default:
break;
}
}
AspNetPager1.RecordCount = NewsInfoControl.GetCount(searchPredicate);
}
void bindData()
{

List<NewsInfo.NewsInfo> hhh = NewsInfoControl.GetList(AspNetPager1.StartRecordIndex, AspNetPager1.PageSize, searchPredicate);
Repeater1.DataSource = hhh;
Repeater1.DataBind();
}
protected void AspNetPager1_PageChanged(object src, EventArgs e)
{
bindData();
}
}

 回复 引用   
#30楼2009-01-19 14:22 | 张文奇[未注册用户]
@blfr
点击事件代码:
protected void ibtnSearch_Click(object sender, ImageClickEventArgs e)
{
NameValueCollection nvcParam = new NameValueCollection(Request.QueryString);
if (tbx_NewsID.Text.Length > 0)
{
UrlQueryUtils.UpdateQuery(nvcParam, "NewsID", tbx_NewsID.Text, true);
}
else
{
nvcParam.Remove("NewsID");
}
if (tbx_NewsTitle.Text.Length > 0)
{
UrlQueryUtils.UpdateQuery(nvcParam, "NewsTitle", tbx_NewsTitle.Text, true);
}
else
{
nvcParam.Remove("NewsTitle");
}
if (ddl_NewsCategory.SelectedIndex != 0)
{
UrlQueryUtils.UpdateQuery(nvcParam, "NewsCategory", ddl_NewsCategory.SelectedItem.Value, true);
}
else
{
nvcParam.Remove("NewsCategory");
}

Response.Redirect("search.aspx?" + Net.KKcms.Common.UrlQueryUtils.GetRedirectUrl(nvcParam));
}

搜索出来的效果如下:
http://localhost/search.aspx?NewsCategory=1&NewsID=38&NewsTitle=%e8%b4%a2

 回复 引用   
#31楼2009-02-04 20:46 | blfr[未注册用户]
谢谢楼主的回答!楼主还能把三个方法的关键代码写一下啊?小弟困扰数月了!
如:列名由dropdownlist控件决定,另一dropdownlist控件显示选择的列下的值,这样来查找!
望不吝赐教!!
望不吝赐教!!
我是在互联网上到处找,也没找到好的方法,还到宝地请楼主赐教!!如:
表A,有列名a,b,c,dropdownlist控件1中可选择a,b,c列名;
dropdownlist控件2对应选择a,b,c列名下的数据;
即where s.变量=变量,该怎么写??

 回复 引用   
#32楼2009-02-04 20:50 | blfr[未注册用户]
DataContext执行SQL语句????
又该怎样写变量替换的SQL语句?
楼主神龙再现吧!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 回复 引用 查看   
#33楼[楼主]2009-02-05 14:49 | 肖坤      
@blfr

你好,我已经把对应的方法写了个范例发在文章结尾处了。欢迎一起讨论。

 回复 引用   
#34楼2009-02-05 21:11 | blfr[未注册用户]
相当相当感谢楼主的热心!!!
今天终于在楼主提示下用 "用switch"的方法搞定了,
开心啊!毕竟研究了3个月,差了无数资料!
再一次感谢楼主的指点和博才!

 回复 引用   
#35楼2009-04-01 11:32 | Other[未注册用户]
看了你的文章,但是有一点个人疑问,就是怎么嵌入lambda子查询。

例如

DataContext db = new DataContext();
....
if(xxx)
searchPredicate.Add(u=>from otherDB in db.otherdb where otherDB.xxx = u.xxx)

请问在这种情况下我应该如何使用,谢谢

 回复 引用   
#36楼2009-04-16 15:13 | chenm[未注册用户]
赞一个
 回复 引用   
#37楼2009-05-14 15:34 | dingx[未注册用户]
看了半天,发现你那东西还是没用
 回复 引用   
#38楼2009-06-18 23:26 | EricPoon[未注册用户]
是“开思测绘”的肖工吗?
 回复 引用 查看   
#39楼[楼主]2009-06-18 23:58 | 肖坤      
我是武汉的~~
 回复 引用   
#40楼2009-06-20 23:14 | irony[未注册用户]
其实,有个小窍门可以基本实现Linq动态查询
1.建立个Gridview(类似listbox等的也可以),用Gridview任务的建立数据源建立个linqsource,注意设置where
2,在where里面设置字段==Session(控件也可以),你要几个就几个
3,可以在aspx文件里看到生成的代码了
4,在按扭里面LinqDataSource.Where = pp1(pp1是什么你自己写了)(如果不用Session的话都不用写代码了,把控件的autoposbak钩上就行

 回复 引用   
#41楼2009-06-21 15:52 | irony[未注册用户]
在VS2008帮助里看到了,注意"动态生成为 LINQ 查询 "
配置 Where 表达式 - LinqDataSource
请参见 发送反馈意见

在“配置 Where 表达式”对话框中,可以定义条件,由 LinqDataSource 控件返回的记录必须符合这些条件。这些条件动态生成为 LINQ 查询 Where 子句的一部分。

可以向 Where 子句添加一个或多个搜索条件。对于每个搜索条件,都可以指定一个文本值或参数化值。利用参数化值,可以绑定到应用程序变量、用户属性、控件值以及其他数据。有关如何设置 Where 子句的更多信息,请参见 Where 属性。

如果 AutoGenerateWhereClause 属性为 false,则通过单击“配置数据源 - LinqDataSource”对话框中的“Where”按钮,可以访问“配置 Where 表达式”对话框。如果将 AutoGenerateWhereClause 属性设置为 true,则“Where”按钮将显示“表达式编辑器”对话框。这是因为不能既设置 Where 子句又让 LinqDataSource 控件生成 Where 子句。

演练:使用 LinqDataSource 和 DetailsView 控件检索、更新、插入和删除数据

演练:使用 LinqDataSource 和 GridView 控件选择和筛选数据子集


指定要在 Where 子句中使用的属性。从下拉列表中选择的值将成为搜索条件左侧的内容。

运算符
指定要在 Where 子句条件中使用的运算符。

Source
指定要在 Where 子句搜索条件中使用的源。选择的源将成为搜索条件右侧的内容。可选择“无”、“控件”、“Cookie”、“窗体”、“配置文件”、“QueryString”和“会话”。

每个源都在 LinqDataSource 控件的 WhereParameters 集合中产生一个不同的 Parameter 控件,如下表所示:


生成的参数


Parameter

控件
ControlParameter

Cookie
CookieParameter

窗体
FormParameter

字段
ProfileParameter

QueryString
QueryStringParameter

会话
SessionParameter


 回复 引用 查看   
#42楼2009-11-13 18:13 | 破宝      
我觉得最后那个外国人写的方案还不错.

searchPredicate = PredicateExtensions.True<UserT_TractInfo>()

看了一下PredicateExtensions的代码,这里的True和False最后形成SQL语句的时候就会形成一个True/False的条件。

比方说,你下面写的都是And(xxxx),所以最后生成的SQL应该是类似:“... WHERE true AND xxxx”

根据实际情况,如果你后面的条件都是AND关系的话,最初的这个条件肯定要选True,否则如果用False则满盘皆输(即使后面所有的条件都满足,也会因为第一个条件不满足而被过滤掉)。

反过来说,如果你后面的条件都是OR关系的话,最初这个条件应该选False,否则如果用True则会形成干扰: ... WHERE true OR xxxx 即使后面的条件全部都不满足,也会因为第一个true而最终运算结果为true。

如果你后面的条件既有And又有Or,写SQL时需要加上括号,则用PredicateExtensions时应该也是可以做得到的,比如说 A and (B or C) ,则先算括号里头的,再算括号外头的(以下代码未测试,随手写的):

Expression<Func<T, bool>> BorC = PredicateExtensions.False<UserT_TractInfo>().Or(B条件lambda式).Or(C条件lambda式);

searchPredicate = PredicateExtensions.True<UserT_TractInfo>().And(A条件lambda式).And(BorC);


 回复 引用   
#43楼2009-12-09 00:04 | 弦哥[未注册用户]
linq的like null 的问题主要就是String.Contains 为空的问题
其实我们可以自己写个Contains 就完事了,你们都搞的太复杂了...
比如可以写个string的扩展方法
public static bool LinqLikeContains(this string s,string value)
{
if (string.IsNullOrEmpty(value))
return false;
return value.Contains(s);//注意 这里是反的
}

 回复 引用 查看   
#44楼2009-12-16 02:15 | K.K      
我最近也在学linq,碰巧也正好看到yjinglee的动态查询,虽然内容上有点麻烦,但的确讲明白如何创建Select/Where等操作的Expression Tree。

不知道到楼主为什么说“lambda表达式是写不出.Contains()”的?这句话没有错,因为.Contains()是MethodCallExpression!

比如:
var context = new NorthwndDataContext();
var customers =
from c in context.Customers
where c.City.Contains("lon")
select c;
这个expression query的表达式为:Table(Customers).Where(c => c.City.Contains("lon"))

通过以下代码可以生成上述Expression Tree:
ParameterExpression parameterExpr = Expression.Parameter(typeof(Customers), "c");
MemberExpression cityExpr = Expression.Property(parameterExpr, "City");
// 生成Contains的MethodCallExpression
MethodCallExpression containsExpr = Expression.Call(cityExpr, "Contains", null, Expression.Constant("lon"));
Expression<Func<Customers, bool>> lambdaExpr = Expression.Lambda<Func<Customers, bool>>(containsExpr, parameterExpr);
MethodCallExpression whereExpr = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { typeof(Customers) },
Expression.Constant(context.Customers), lambdaExpr
);

//输出的sql语句
var query = context.Customers.AsQueryable().Provider.CreateQuery(whereExpr);
Console.WrtineLine(context.GetCommand(query).CommandText);

输出如下:
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun
try], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[City] LIKE @p0

从sql语句来看,生成的expression tree是正确的。

 回复 引用 查看   
#45楼2010-05-16 10:52 | 撞破南墙      
哎 。看完博主的文章我还是想摇头。。
不好用啊!

求解决! 更优雅的方法

 回复 引用 查看   
#46楼[楼主]2010-05-16 22:14 | 肖坤      
呵呵,好久没有回复了,现在推荐一个更优雅和高效的方式:http://www.codeplex.com/MultiTierLinqToSql,可以通过这个开源组件,实现较为自动化的controller与model生成,并可以完全支持动态查询。
 回复 引用 查看   
#47楼2010-07-01 09:50 | Ryan Boo      
IQueryable<View_InvoiceTransferLog> query = from view in Context.View_InvoiceTransferLogs
where
(startDate == null || view.LogDate >= startDate) &&
(endDate == null || view.LogDate <= endDate) &&
(startNum == null || view.InvoiceStartNum >= startNum) &&
(endNum == null || view.InvoiceEndNum <= endNum) &&
view.TransferType == theType
select view;
return query.ToList();

 回复 引用 查看   
#48楼2010-08-03 18:18 | 吾跃乾坤      
好文,不知道楼主是否研究过 linq to entity

我在linq to sql 里面扩展了个 Delete方法,可以这样使用
db.Users.Delete(o=>o.sex=="gril")
可以达到批量删除,还有类似的批量修改和插入

但在linq to entity里面就不知道怎么扩展

 回复 引用 查看   
#49楼2012-01-13 16:08 | ucfar      
直接这样,不是更简单明了?
//Lamda的写法
var q = dc.Query<JDC>().Select(i => new {Id = i.ID, i.TITLE});
q = q.Where(s => s.Id < 10);
q = q.Where(s => s.TITLE.StartsWith("标题"));