LINQlinq 动态查询询求助

LINQ如何查询动态的字段?
[问题点数:40分]
LINQ如何查询动态的字段?
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年9月 挨踢职涯大版内专家分月排行榜第一
2010年12月 .NET技术大版内专家分月排行榜第二2010年10月 挨踢职涯大版内专家分月排行榜第二2010年8月 挨踢职涯大版内专家分月排行榜第二
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第四
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第四
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第四
2010年9月 挨踢职涯大版内专家分月排行榜第一
2010年12月 .NET技术大版内专家分月排行榜第二2010年10月 挨踢职涯大版内专家分月排行榜第二2010年8月 挨踢职涯大版内专家分月排行榜第二
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第四
2015年12月 .NET技术大版内专家分月排行榜第二2015年2月 .NET技术大版内专家分月排行榜第二2015年1月 .NET技术大版内专家分月排行榜第二2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
2015年10月 .NET技术大版内专家分月排行榜第三2015年9月 .NET技术大版内专家分月排行榜第三2015年7月 .NET技术大版内专家分月排行榜第三2015年6月 .NET技术大版内专家分月排行榜第三2015年5月 .NET技术大版内专家分月排行榜第三2015年4月 .NET技术大版内专家分月排行榜第三2014年12月 .NET技术大版内专家分月排行榜第三2014年10月 .NET技术大版内专家分月排行榜第三2014年9月 .NET技术大版内专家分月排行榜第三2014年1月 .NET技术大版内专家分月排行榜第三2013年12月 .NET技术大版内专家分月排行榜第三2013年10月 .NET技术大版内专家分月排行榜第三2013年5月 .NET技术大版内专家分月排行榜第三2011年9月 .NET技术大版内专家分月排行榜第三2011年2月 .NET技术大版内专家分月排行榜第三2010年2月 .NET技术大版内专家分月排行榜第三
2015年12月 .NET技术大版内专家分月排行榜第二2015年2月 .NET技术大版内专家分月排行榜第二2015年1月 .NET技术大版内专家分月排行榜第二2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
2015年10月 .NET技术大版内专家分月排行榜第三2015年9月 .NET技术大版内专家分月排行榜第三2015年7月 .NET技术大版内专家分月排行榜第三2015年6月 .NET技术大版内专家分月排行榜第三2015年5月 .NET技术大版内专家分月排行榜第三2015年4月 .NET技术大版内专家分月排行榜第三2014年12月 .NET技术大版内专家分月排行榜第三2014年10月 .NET技术大版内专家分月排行榜第三2014年9月 .NET技术大版内专家分月排行榜第三2014年1月 .NET技术大版内专家分月排行榜第三2013年12月 .NET技术大版内专家分月排行榜第三2013年10月 .NET技术大版内专家分月排行榜第三2013年5月 .NET技术大版内专家分月排行榜第三2011年9月 .NET技术大版内专家分月排行榜第三2011年2月 .NET技术大版内专家分月排行榜第三2010年2月 .NET技术大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。用LINQ实现动态查询详解
一、首先交代一下写这篇文章的背景:
1. 我正在写一个离退休干部管理的小系统,基本框架用的是在中介绍的,这本书相当不错,其中的代码作为一个中小型项目的框架应该说是充分适用的;
2. 该框架的DAL层用的是LINQ,但该书中并不包含任何动态查询的部分;
我的需求要求我按照性别、出生日期、民族、级别、待遇、籍贯、入党时间、政治面貌、所属支部、党内职务等进行动态查询,也就是这些查询输入项只输入部分,而且即使输入了可能也是部分(比如对于籍贯“辽宁省沈阳市”,可能只输入“辽宁”),其需求情景与给出的十分类似,具体的界面我就没有给出,画得实在太烂。这种情况肯定经常遇到。
4. 这几个资源给我很大的帮助,,,;如果你能读通“第一”,那我这篇文章对你来说意义不大。
另外,需要说明的是:由于时间关系,很多涉及到的知识我还没弄得特别明白,错漏之处大家见笑了。另外框架用的是三层架构,我这里的动态查询由于时间紧迫没有能够遵循这个规则,直接从UI去访问了DAL。有时间我再把它改写一下。
二、接着在交待一下技术大前提,没有两步,你的程序死活是转不起来的:
1。先通过中的链接找到Dynamic.cs,加到你的项目当中;
2。然后在上文的“”中找到PredicateExtensions类的文本copy&paste到Dynamic.cs中。PredicateExtension本来是一个老外写得,可惜这个老外的博客已经在网上找不到了,好在肖坤博客中给出了这段文本。
再简单地交待一下界面,这样你在读下面的代码时不会觉得太突兀:
1. 我要介绍的当前界面EmployeeDynamicQuery.aspx有一个母板页(masterpage),
母板页上有一个button,选好条件后点击该button在本页的一个gridview(cgvEmployees)上显示查询结果;
2。cgvEmployees是一个custom的gridview,支持排序和分页。
下面看一下代码:
(1)从Master_QueryButton_Click(object sender, EventArgs e)开始:
&void Master_QueryButton_Click(object sender,
EventArgs e)
//先释放GridView资源
cgvEmployees.Dispose();
//初始化DataContext,实际上这个地方直接去访问了DAL层,在下面的时间里抽空把这部分重写一下
RetiredEmployeeDataContext db = new
RetiredEmployeeDataContext();
&&&//LambdaExpression
expr = DynamicExpression.ParseLambda(typeof(RetiredEmployee),
typeof(bool),"Gender = @0 and Nationality = @1", "男", "汉族");
&&&//LambdaExpression
sortExpr=DynamicExpression.ParseLambda(typeof(RetiredEmployee),typeof(bool),""
//获得页面上的查询各输入项的名、值对,并构造动态复合模糊查询
&&&//动态复合模糊查询的关键是引入了Dynamic.cs,而且在其中为了能够支持like(contains)还在该文件中加入了PredicateExtensions类
&&&NameValueCollection
nvcQueryKeyValue = getNVCQueryKeyValue();
&&&Expression&Func&RetiredEmployee,
bool&& searchPredicate =
getLambdaExpr(nvcQueryKeyValue);
&&&//var query =
db.RetiredEmployees.Where("Gender = @0 and Nationality = @1",
(Byte)1, "东乡族").OrderBy("employeeId").ToList();
//为了使构造的动态查询语句能够打印出来以方便调试,也就是只有你知道构造出来的查询语句是什么样的
//你才知道如果没有出现你预计的查询结果的时候你才会知道文提出在哪儿,我按照相对复杂的方式构造的expression
&&&IQueryable&RetiredEmployee&
retireds = db.RetiredE
&&&Expression
expr = Expression.Call(typeof(Queryable), "Where",
Type[] { typeof(RetiredEmployee) },Expression.Constant(retireds),
searchPredicate);
&&&IQueryable&RetiredEmployee&
db.RetiredEmployees.AsQueryable().Provider.CreateQuery&RetiredEmployee&(expr);
db.RetiredEmployees.Where(searchPredicate).OrderBy("employeeId").ToList();
&&&//DbCommand
cmd = db.GetCommand(query);
&&&//Console.mandText);
&&&//searchPredicate).OrderBy("employeeId").ToList();
//查询结果造型为包含自定义类型的list
&&&List&RetiredEmployee&
employeeList = new
List&RetiredEmployee&(query);
//与自定义CustomGridView绑定
&&&//Tell the
control what class to create and what method to call to load the
&&&cgvEmployees.ListClassName
= typeof(RetiredEmployeeEOList).AssemblyQualifiedN
&&&cgvEmployees.LoadMethodName
= "LoadFromQuery";
&&&cgvEmployees.LoadMethodParameters.Add(employeeList);
&&&cgvEmployees.DataBind();
&(2)然后看第二段代码,遍历页面上的控件把选择、输入的结果构造成NameValueCollection.如下:
&protected NameValueCollection
getNVCQueryKeyValue()
&&NameValueCollection myCol = new
NameValueCollection();
(!String.IsNullOrEmpty(ddlGender.SelectedValue)&&ddlGender.SelectedValue!="全部")
&&&myCol.Add("Gender",
ddlGender.SelectedValue.Equals("男")?"1":"0");
&&//出生日期
(!String.IsNullOrEmpty(txtBirthday.Text))
&&&myCol.Add("Birthday",txtBirthday.Text);
(!String.IsNullOrEmpty(ddlNationality.SelectedValue)
&& ddlNationality.SelectedValue !=
&&&myCol.Add("Nationality",
ddlNationality.SelectedValue);
(!String.IsNullOrEmpty(txtHometown.Text))
&&&myCol.Add("Hometown",txtHometown.Text);
&&//参加工作日期
(!String.IsNullOrEmpty(txtDayEmployeed.Text))
&&&myCol.Add("DayEmployeed",
txtDayEmployeed.Text);
&&//政治面貌
(!String.IsNullOrEmpty(ddlPolitics.SelectedValue)
&& ddlPolitics.SelectedValue !=
&&&myCol.Add("Politics",
ddlPolitics.SelectedValue);
&&//入党时间
(!String.IsNullOrEmpty(txtDayParty.Text))
&&&myCol.Add("DayParty",
txtDayParty.Text);
&&//所属支部
(!String.IsNullOrEmpty(ddlBelongto.SelectedValue)
&& ddlBelongto.SelectedValue !=
&&&myCol.Add("Belongto",
ddlBelongto.SelectedValue);
&&//党内职务
(!String.IsNullOrEmpty(ddlTitleInParty.SelectedValue)
&& ddlTitleInParty.SelectedValue !=
&&&myCol.Add("TitleInParty",
ddlTitleInParty.SelectedValue);
&&//离休、退休
(!String.IsNullOrEmpty(ddlRetiredOr.SelectedValue)
&& ddlRetiredOr.SelectedValue !=
&&&myCol.Add("RetiredOr",
ddlRetiredOr.SelectedValue.Equals("退休") ? "1" : "0");
&&//离退休时间
(!String.IsNullOrEmpty(txtDayRetired.Text))
&&&myCol.Add("DayRetired",
txtDayRetired.Text);
&&//离退休前工作部门
(!String.IsNullOrEmpty(txtDepartment.Text))
&&&myCol.Add("Department",
txtDepartment.Text);
(!String.IsNullOrEmpty(ddlLevel.SelectedValue)
&& ddlLevel.SelectedValue !=
&&&myCol.Add("Level",
ddlLevel.SelectedValue);
(!String.IsNullOrEmpty(ddlTreatment.SelectedValue)
&& ddlTreatment.SelectedValue !=
&&&myCol.Add("Treatment",
ddlTreatment.SelectedValue);
(!String.IsNullOrEmpty(ddlAcaTitle.SelectedValue)
&& ddlAcaTitle.SelectedValue !=
&&&myCol.Add("AcaTitle",
ddlAcaTitle.SelectedValue);
&&return myC
(3) 第三段代码构造searcPredicate这个lambdaexpression,其目的当然是构造最后的查询语句,如下:
&protected
Expression&Func&RetiredEmployee,
getLambdaExpr(NameValueCollection nvcParam)
&&Expression&Func&RetiredEmployee,bool&&
searchPredicate=PredicateExtensions.True&RetiredEmployee&();
&&foreach (string key in
condition = string.E
"Gender"://性别
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Gender.Equals(Convert.ToByte(condition)));
"Birthday"://出生年月日
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Birthday.ToString().Substring(0,10).Contains(condition));
&&&&&&//DateStringHelper.getStringFromDate(employee.Birthday).Contains(condition));
"Nationality"://民族
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Nationality.Contains(condition));
"Hometown"://籍贯
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Hometown.Contains(condition));
"DayEmployeed"://参加工作时间
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.DayToEmployed.ToString().Substring(0,
10).Contains(condition));
"Politics"://政治面貌
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Politics.Contains(condition));
"DayParty"://入党日期
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.DayParty.ToString().Substring(0,
10).Contains(condition));
"Belongto"://所属支部
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Belongto.Contains(condition));
"TitleInParty"://党内职务
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.TitleInParty.Contains(condition));
"RetiredOr"://离休还是退休
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.RetiredOr.Equals(Convert.ToByte(condition)));
"DayRetired"://离退休时间
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.DayRetired.ToString().Substring(0,
10).Contains(condition));
"Department"://工作部门
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Department.Contains(condition));
"Level"://级别
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Level.Contains(condition));
"Treatment"://待遇
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.Treatment.Contains(condition));
"AcaTitle"://职称
&&&&&condition
= nvcParam[key];
&&&&&searchPredicate
= searchPredicate.And(employee =&
employee.AcaTitle.Contains(condition));
&&&&default:
最后,想说得是,构造动态查询的主要部分都给出了,肯定可以根据你自己的具体情况再扩展。如果你还看不太懂,可以给我发邮件:.
版权所有,转载著名出处
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。LINQ动态查询求助_百度知道
LINQ动态查询求助
参数是两个表结构一样的内存DataTable (但表结构是不确定的),现在这个函数要返回
dTableA和dTableB中每个字段的值都相同的那些记录构成的新表。如何实现:private DataTable myFun(DataTable dTableA需求, DataTable dTableB){
提问者采纳
1:for 循环判断2:百度
提问者评价
来自团队:
其他类似问题
为您推荐:
linq的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 linq动态条件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信