读书人

LINQ 多条件查询如何写

发布时间: 2012-12-17 09:31:41 作者: rapoo

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了

读书人网 >.NET

热点推荐