我想要检索所有具有IP或MAC地址的记录,或者如果其中任何一个是Null,那么我编写的方法如下: -
public IQueryable<Technology> AdvanceSearch(string ip = null, string mac = null, int techtype)
{
var relatedresourcesID = entities.NetworkInfoes
.Where((a => String.IsNullOrEmpty(ip) || a.IPADDRESS.StartsWith(ip)))
.Where(a2 => String.IsNullOrEmpty(mac) || a2.MACADDRESS.StartsWith(mac)).Select(a3=>a3.WORKSTATIONID);
//code goes here
但我不确定EF将如何转移.where;只有在应用第一个.Where子句后,它才会应用第二个.Where()吗?
第二个问题,我如何将所有检查应用于一个.Where()??
我试图重写我的方法如下: -
var relatedresourcesID = entities.NetworkInfoes
.Where((a => String.IsNullOrEmpty(ip) || a.IPADDRESS.StartsWith(ip)) && (a2 => String.IsNullOrEmpty(mac) || a2.MACADDRESS.StartsWith(mac)) )
.Select(a3=>a3.WORKSTATIONID);
但我会收到以下错误: -
错误18运营商'&amp;&amp;'不能应用于'lambda'类型的操作数 表达'和'lambda 表达式'C:\ Users \ Administrator \ documents \ visual studio 2012 \ Projects \ TMS \ TMS \ Models \ Repository.cs 914 24 TMS
答案 0 :(得分:9)
您应该将单lambda expression传递到where运算符:
var relatedresourcesID = entities.NetworkInfoes
.Where(a => (String.IsNullOrEmpty(ip) || a.IPADDRESS.StartsWith(ip)) &&
(String.IsNullOrEmpty(mac) || a.MACADDRESS.StartsWith(mac)))
.Select(a => a.WORKSTATIONID);
注意:您不需要在每个运算符中分配新的参数名称 - 这些范围不会重叠。
另外,请不要忘记声明性查询语法,它更具可读性(恕我直言),根本不会使用lambdas:
var relatedresourcesID =
from a in entities.NetworkInfoes
where (String.IsNullOrEmpty(ip) || a.IPADDRESS.StartsWith(ip)) &&
(String.IsNullOrEmpty(mac) || a.MACADDRESS.StartsWith(mac))
select a.WORKSTATIONID;