日期:2014-05-20  浏览次数:20787 次

LINQ 多条件查询怎么写?
1.页面用TextBox输入查询信息
           <table>
                <tr>
                    <td>设备编号:</td>
                    <td>@Html.TextBox("deviceCode")
                        @Html.ValidationMessage("deviceCode")
                    </td>
                </tr>
                  ...
            <table>
2.用linq来写查询语句
[HttpPost]
        public ActionResult Search(FormCollection collection)
        { 
            var q = from p in db.Devices select p;
            if (!string.IsNullOrEmpty(collection["deviceCode"]))
             q = q.Where(p => p.deviceCode == int.Parse(collection["deviceCode"]));
              ...
            return View(q.ToList());
         }
最后弹出LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。 究竟应该怎么写多条件查询?
------最佳解决方案--------------------
var q =  (from p in db.Devices.ToList()
------其他解决方案--------------------
Linq是延迟加载的,一个Lambda语句结束时,生成的并不是结果集,而是一个SQL指令集,只有当程序请求该结果集的值的时候,才会实际执行该SQL指令查询出结果。

所以如果你的LinqToSQL语句中包含有无法转译为SQL的代码段的时候,就会抛出异常,这类错误通常发生于对筛选条件执行函数操作。

而ToList,AsEnumerable之类的方法都需要把数据实际压入新的数据结构中,执行这类方法会立即执行LinqToSQL语句,然后对生成的中间集进行Linq查询的时候,调用的是LinqToEntity的底层代码,不会再抛出SQL转译的异常。

楼主,40分啊,你懂的。
------其他解决方案--------------------
q = q.Where(p => p.deviceCode == Convert.ToInt32(collection["deviceCode"]));
------其他解决方案--------------------
那这样:

  public ActionResult Search(FormCollection collection)
         { 
             var q = (from p in db.Devices select p).ToList();
             if (!string.IsNullOrEmpty(collection["deviceCode"]))
              q = q.Where(p => p.deviceCode == int.Parse(collection["deviceCode"])).ToList();
               ...
             return View(q);