运营商&&'不能应用于'lambda expression'和'lambda表达式'类型的操作数

时间:2013-10-25 23:14:39

标签: c# entity-framework lambda

我想要检索所有具有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

1 个答案:

答案 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;