首页 新闻 会员 周边

LINQ多表动态查询?

0
悬赏园豆:100 [已解决问题] 解决于 2009-12-23 15:56

最近做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 ?

changbluesky的主页 changbluesky | 小虾三级 | 园豆:854
提问于:2009-12-20 23:10
< >
分享
最佳答案
0

你有两个选择:

第一个是用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

收获园豆:50
persialee | 老鸟四级 |园豆:3217 | 2009-12-22 09:55
lamdba有些难哦,很好的soluction,学习中...
changbluesky | 园豆:854 (小虾三级) | 2009-12-23 15:56
还有一个方法,用predicate builder http://www.albahari.com/nutshell/predicatebuilder.aspx
海南K.K | 园豆:175 (初学一级) | 2009-12-31 18:26
其他回答(2)
0

比较好用的就是 老外写的一个 LINQ dynamic.cs

PS:LINQ 的动态查询不是很好。

疯流成性 | 园豆:3 (初学一级) | 2009-12-21 13:30
1

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不做筛选条件

如果条件不成立则执行筛选

我只是判断是否为空  你可以加你自己的条件

应该明白了吧

收获园豆:50
alun | 园豆:260 (菜鸟二级) | 2009-12-22 09:51
so great.这样写太easy了.感谢!
支持(0) 反对(0) changbluesky | 园豆:854 (小虾三级) | 2009-12-23 15:55
厉害...我怎么没有想到呢.
支持(0) 反对(0) changbluesky | 园豆:854 (小虾三级) | 2009-12-23 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册