最近做LINQ的一个测试工作,需要把多表的SQL动态条件查询转为LINQ的查询.
string strSQL="SELECT A.ORDER,B.ORDITM,A.ORDDAT,A.ORDTIM,B.PRICE FROM A JOIN B ON A.ORDER=B.ORDER JOIN C ON B.PN=C.PN ";
if(chkOrderDate.Checked == true)
{
strSQL+=" A.ORDDAT BETWEEN '"+fromDate.Text.Trim()+"' AND ''"+toDate.Text.Trim()+" ";
}
if(chkOrderNumber.Checked==true)
{
strSQL+=" A.ORDER='"+txtOrderNumber.Text.Trim()+"' ";
}
....送给DB执行.
请教如何转为LINQ动态查询.
现在已经建立LINQ To SQL 的datacontext
LQ_DBDataContext LQ_DB = new LQ_DBDataContext(ConnectionString);
varPO=from a in LQ_DB.A
from b in LQ_DB.B on A.ORDER equals B.ORDER
from c in LQ_DB.C on B.PN equals C.PN
where A.ORDER==txtOrderNumber.Text.Trim() && A.ORDDAT>=Convert.ToInt32(fromDate.Text.Trim()) && A.ORDDAT<=Convert.ToInt32(toDate.Text.Trim())
select new {
A.ORDER,
B.ORDITM,
A.ORDDAT,
A.ORDTIM,
B.PRICE
};
//WHERE条件是不对的.应该是实际选择的条件, USER选择的条件不一样, LINQ中的WHERE中的条件应该不一样, 会得出来不同的处理结果. 请教圈子中的高人如何写这样的多表变量条件查询动态LINQ ?
你有两个选择:
第一个是用lambda表达式动态构建
http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html
第二个用LINQ dynamic
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
比较好用的就是 老外写的一个 LINQ dynamic.cs
PS:LINQ 的动态查询不是很好。
Linq的动态查询可以选择三目运算简单方便 例如:
where (string.IsNullOrEmpty(regName.Text.Trim()) ? true : a.name.Contains(regName.Text))
&& (string.IsNullOrEmpty(regTime1.Text.Trim()) ? true : a.pdate.Value > regtime1转换日期后的值)
&& (string.IsNullOrEmpty(regTime2.Text.Trim()) ? true : a.pdate.Value <regtime2转换日期后的值)
前面加条件 如果条件成立则返回true不做筛选条件
如果条件不成立则执行筛选
我只是判断是否为空 你可以加你自己的条件
应该明白了吧