日期:2014-05-18  浏览次数:20757 次

LinqToSql的问题 多条件 动态变化查询条件怎样查询
C# code


 StringBuilder sb = new StringBuilder();
                sb.Append(" select * from feemain where 1=1");
                if (cmb_sf.Text != "")
                    sb.Append(" and wtdw='" + cmb_sf.Text + "'");
                if (txt_blno.Text != "")
                    sb.Append(" and blno='" + txt_blno.Text + "'");
                if (usetime.Checked)
                    sb.Append(" and indatatime>='" + dtp1.Value + "' and indatatime<='" + dtp2.Value + "'");
                if (cmb_ywlx.Text != "")
                    sb.Append(" and receive='" + cmb_ywlx.Text + "'");

                DataSet dd = Maticsoft.DBUtility.DbHelperSQL.Query(sb.ToString());
                dataGridView1.AutoGenerateColumns = false;
                dataGridView1.DataSource = dd.Tables[0];

                //上面的是一般的的查询的方法

                //如果换成linq的写法的话 怎样将 这个 StringBuilder 也就是sb的值写进linq语句呢? 
                //求帮助 下面不会写了 因为这个查询条件是不断的变化的 所以只能用这个动态的增加查询条件
                StartLinqDataContext con = new StartLinqDataContext();
                var q=from c in con.FeeMain where ???sb.ToString()??? select c;//这儿怎么写呢???
                dataGridView1.AutoGenerateColumns = false;
                dataGridView1.DataSource = q;




------解决方案--------------------
C# code

                StartLinqDataContext con = new StartLinqDataContext();
                var q=con.FeeMain;
                if (cmb_sf.Text != "")
                    q = q.Where(w => w.wtdw == cmb_sf.Text);                   
                if (txt_blno.Text != "")
                    q = q.Where(w => w.blno == txt_blno.Text);                   
                if (usetime.Checked)
                    q = q.Where(w => w.indatatime>= Convert.ToDateTime(dtp1.Value)&&w.indatatime<=  Convert.ToDateTime(dtp2.Value));        
                if (cmb_ywlx.Text != "")
                    q = q.Where(w => w.receive == cmb_ywlx.Text);

------解决方案--------------------
StartLinqDataContext con = new StartLinqDataContext();
var q=from c in con.FeeMain
select c;
if (cmb_sf.Text != "")
{q = from h in q 
where h.wtdw == cmb_sf.Text 
select h;}
if (txt_blno.Text != "")
{q = from h in q 
where h.blno == txt_blno.Text 
select h;} 
if (usetime.Checked)
{q = from h in q 
where h.indatatime >= Convert.ToDateTime(dtp1.Value)&& h.indatatime<= Convert.ToDateTime(dtp2.Value));
select h;}
if (cmb_ywlx.Text != "")
{q = from h in q 
where h.receive == cmb_ywlx.Text 
select h;}
------解决方案--------------------
楼主能分享最终的解决办法,赞一个。对后来遇到此问题的人是一种帮助:)

你也可以参考这个:

http://blog.csdn.net/q107770540/article/details/5724013
------解决方案--------------------
LINQ的延迟查询特性决定了,只有需要用到结果中的数据时,程序才会去执行查询

C# code

//所以下边的where拼接有多少个,都只会在最后一步时才会去执行查询
var qu = from c in con.FeeMain select c;
            
            if (textBox1.Text != "")
                qu = qu.Where(c => c.wtdw == textBox1.Text