今天想到 Linq to sql 好像没法做可变条件的查询

忽然想到一个问题,Linq to sql 如何做多条件的检索呢?
sql 中我们可以拼接:

string sql = "select xxx from table1 where 1=1 ";
if (条件1.Length > 0){
    sql += " and 字段1 > @条件1";
    ....
}
if (条件2.Length > 0){
    sql += " and 字段2 > @条件2";
    ....
}
...

但是 Linq to sql 我不知道怎么办了,Linq to sql 语句语法是 C# 的,怎么拼接。。。难道只能通过存储过程来实现?

现在想到的办法是用扩展方法的原始写法:

  var data = from item in db.Users select item;
  if(address.Length > 0)
   data = data.Where(item => item.Address.Contains(address));
  if(...)
   data = data.Where(...);
posted @ 2007-08-19 02:17 木野狐(Neil Chen) 阅读(585) 评论(12)  编辑 收藏 所属分类: Linq/C#3.5

  回复  引用  查看    
#1楼 2007-08-19 20:24 | deerchao      
应该可以编程生成Expression来实现吧?
  回复  引用  查看    
#2楼 [楼主]2007-08-20 01:11 | 木野狐(Neil Chen)      
@deerchao
是一种办法,但是写起来也比较费事。
我现在经过一些试验已经弄清楚了,可能还是用扩展方法串接着写要方便些。
  回复  引用  查看    
#4楼 [楼主]2007-08-20 15:49 | 木野狐(Neil Chen)      
  回复  引用  查看    
#5楼 2007-08-24 14:10 | henry      
这种应用非常普遍,搞不懂现版的DLINQ设计成这样,其待正式版出来后有所改变.
以下是自己的表达式对象:
Expression exp = new Expression();
if (!Common.IsEmpty(view.Customer))
{
exp &= DB.Orders.Company.Match(view.Customer);
}
if (view.OrderDataFrom != DateTime.MinValue)
{
exp &= DB.Orders.OrderDate >= view.OrderDataFrom;
}
if (view.OrderDateTo != DateTime.MinValue)
{
exp &= DB.Orders.OrderDate < view.OrderDateTo;
}
view.Orders = exp.List<Orders>(view);
  回复  引用    
#6楼 2007-08-28 11:41 | GN [未注册用户]
-_- 都在玩LINQ了啊 - -
坚决在正式版出来前都不会去玩- -

不过- -
可以用来替代存储过程?
  回复  引用  查看    
#7楼 [楼主]2007-08-28 11:44 | 木野狐(Neil Chen)      
@GN
和存储过程没有可比性,两个不同层面的东西。

  回复  引用    
#9楼 2007-08-28 12:02 | GN [未注册用户]
看过资料后觉得。。。我还是在SELECT下用LINQ吧,其它时候就先别用了
  回复  引用  查看    
#10楼 [楼主]2007-08-28 12:07 | 木野狐(Neil Chen)      
@GN

scottgu 的 blog 最近刚写了几篇在 Linq to sql 中调用存储过程执行更新,删除等操作的,还有一篇写执行任何自定义 sql 的,也非常方便。你可以参考一下。

linq to sql 的好处:

1. 可以在执行自定义的操作之前,调用到模型中的自定义的验证逻辑;
2. 还可以在返回结果后,自动转化为指定类型的对象集合。
3. 跟踪返回对象的更改,并可以将对它们的修改更新到服务器。

这些都是直接用 ADO.NET 的方式执行查询做不到的,所以,能用还是用吧。
  回复  引用    
#11楼 2007-08-28 12:09 | GN [未注册用户]
那么爽啊
恩恩,等正式版出了就玩LINQ
现在先看看吧
  回复  引用  查看    
#12楼 [楼主]2007-08-28 12:16 | 木野狐(Neil Chen)      
http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

动态查询返回结果自动转化为对象集合:

pulic partial class NorthwindDataContext
{
    public IEnumerable  GetProductSummariesByCategory(int categoryID)
    {
        return ExecuteQuery (@"select ProductId, ProductName, UnitPrice from products where categoryid={0}", categoryID);
    }
}


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-08-20 01:00 编辑过


相关链接: