首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

LINQ 多条件查询如何写

2012-12-17 
LINQ 多条件查询怎么写?1.页面用TextBox输入查询信息tabletrtd设备编号:/tdtd@Html.TextBox(de

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);


          }
[其他解释]
你把转换放到外边不就行了
[其他解释]


版主不厚道啊,亲自出来抢分。
[其他解释]
这样我也试过又会报LINQ to Entities 不识别方法“Convert.ToInt32(System.String)”,因此该方法无法转换为存储表达式。  的错误
[其他解释]
最后我改成这样,还是报以下错误,出不来结果,为什么呀?
LINQ to Entities 不识别方法“System.String get_Item(System.String)”,因此该方法无法转换为存储表达式。


            var q =  (from p in db.Devices
                     where (string.IsNullOrEmpty(collection["deviceCode"])? true : p.deviceCode == Convert.ToInt32(collection["deviceCode"]))
                     &&(string.IsNullOrEmpty(collection["deviceName"])?true: p.deviceName == collection["deviceName"])
                     &&(string.IsNullOrEmpty(collection["deviceModel"])?true:p.deviceModel == collection["deviceModel"])
                     &&(string.IsNullOrEmpty(collection["deviceStandard"])?true:p.deviceStandard == collection["deviceStandard"])
                     &&(string.IsNullOrEmpty(collection["capital"])?true:p.capital == collection["capital"])
                     &&(string.IsNullOrEmpty(collection["repairNumber"])?true:p.repairNumber == Convert.ToInt32(collection["repairNumber"]))
                     &&(string.IsNullOrEmpty(collection["upgradeNumber"])?true:p.upgradeNumber == Convert.ToInt32(collection["upgradeNumber"]))
                     &&(string.IsNullOrEmpty(collection["userID"])?true:p.userID == Convert.ToInt32(collection["userID"]))
                     &&(string.IsNullOrEmpty(collection["position"])?true:p.position == collection["position"])
                     &&(string.IsNullOrEmpty(collection["state"])?true:p.state == collection["state"])
                     &&(string.IsNullOrEmpty(collection["deviceType"])?true:p.deviceType == collection["deviceType"])
                     orderby p.deviceID
                     select p).Select(p=>new Device()
                     {


                         deviceID=p.deviceID,
                         deviceCode = p.deviceCode,
                         statePic = new byte[110010],
                         deviceName=p.deviceName,
                         deviceModel=p.deviceModel,
                         deviceStandard=p.deviceStandard,
                         devicePrice=p.devicePrice,
                         supplierID=p.supplierID,
                         producerID=p.producerID,
                         contractID=p.contractID,
                         projectID=p.projectID,
                         capital=p.capital,
                         repairNumber=p.repairNumber,
                         upgradeNumber=p.upgradeNumber,
                         userID=p.userID,
                         guarantPeriod=p.guarantPeriod,
                         position=p.position,
                         deviceSN=p.deviceSN,
                         repairCost=p.repairCost,
                         upgradeCost=p.upgradeCost,
                         outFactoryDate=p.outFactoryDate,
                         purchaseDate=p.purchaseDate,
                         accountDate=p.accountDate,


                         handlerantID=p.handlerantID,
                         requisitionID=p.requisitionID,
                         uselessID=p.uselessID,
                         transferID=p.transferID,
                         loseID=p.loseID,
                         appraiseNumber=p.appraiseNumber,
                         circulateNumber=p.circulateNumber,
                         bidding=p.bidding,
                         state=p.state,
                         deviceType=p.deviceType
                     }).ToList();
[其他解释]
出结果了,太感谢了!这个问题困扰我好几个星期,1.但我不明白为什么将.ToList()写在前面就对了?我的笨办法就是在网上搜帖子,东拼西凑写了这个程序,但很多地方不理解,2.能告诉我正确的方法吗?是要把LINQ学一遍吗?

不好意思问题太多,出结果了,很开心^!^
[其他解释]
不晚呀,又提了问题呀
[其他解释]
跟我一个等级的都这么牛,汗!
好,结题。下次有问题再散分
[其他解释]
一句话:.ToList()先将整个表的数据加载到内存中了
然后后边的查询都是LINQ TO Object查询了,已经不是LINQ TO EF了

热点排行