关于 Linq 多条件查询的问题

里沃特 2010-12-19 11:56:49
比如有一个表 table1(userid int,username varchar(10),nickname varchar(10))

因为搜索需要,用户可能输入 username,也可能输入 nickname. 于是我写了以下的表达式:


string username = txtusername.Text;
string nickname = txtnickname.Text;

var users = (from u in db.table1
where username.length==0?true:u.username.Contains(username) &&
nickname.length==0?true:u.nickname.Contains(nickname)
orderby u.userId descending
select u);


其中 db 为 DataContext 对象。
这样查询的结果不对,跟踪发现生成的查询语句 是用 case 来判断条件,并不是用 and.

结果我为了这样的查询只能改成如下形式:


var users = (from u in db.table1
select u);
if(username!="") {
users = (from u in users
where u.username.Contains(username)
select u);
}
if(nickname!="") {
users = (from u in users
where u.nickname.Contains(nickname)
select u);
}
users = (from u in users
orderby u.userId descending
select u);


这样条件少还好,多了的话比较麻烦,而且性能上面会不会有问题也不知道。

不知道各位高人有没有类似的经验分享?
...全文
386 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyerwing 2010-12-20
  • 打赏
  • 举报
回复
query .Where(p => p.id== textbox1.text&&p.name=="xxx"&&.........);
q107770540 2010-12-20
  • 打赏
  • 举报
回复
原理 2楼sp1234已经讲了
你只要查看最终的SQL语句就会明白了
q107770540 2010-12-20
  • 打赏
  • 举报
回复
利用 LINQ的延迟查询来实现:


var users = from u in db.table1
orderby u.userId descending
select u;

if(!String.IsNullOrEmpty(txtusername.Text))
{
users =users.Where(u=>u.username.Contains(txtusername.Text) );
}


if(!String.IsNullOrEmpty(txtnickname.Text))
{
users =users.Where(u=>u.nickname.Contains(txtnickname.Text) );
}
wuyq11 2010-12-19
  • 打赏
  • 举报
回复
var query = from p in db.Users
where p.id.Contains==textbox1.text
&& textbox1.text == null
|| p.name == textbox2.text
&& textbox1.text== null
select p;
return query;

if (!string.IsNullOrEmpty(textbox1.text))
{
query = query .Where(p => p.id== textbox1.text);
}
里沃特 2010-12-19
  • 打赏
  • 举报
回复
没有其他方法了吗?用 where 的话,首先需要把所有数据加载到内存,好像不太好吧。
里沃特 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]

var query = from p in db.Users
where p.id.Contains==textbox1.text
&& textbox1.text == null
|| p.name == textbox2.text
……
[/Quote]
暂时改成 Where() 的形势。
里沃特 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sp1234 的回复:]

linq会编译这些查询条件。你可以使用lin to sql看看最终发送给数据库的sql语句。
[/Quote]

我已经跟踪过了,你可以看看。
  • 打赏
  • 举报
回复
linq会编译这些查询条件。你可以使用lin to sql看看最终发送给数据库的sql语句。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧