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

joh*_* Gu 5 c# lambda entity-framework

我想要检索所有具有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
Run Code Online (Sandbox Code Playgroud)

但我不确定EF将如何转移.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);
Run Code Online (Sandbox Code Playgroud)

但我会得到以下错误: -

错误18操作符'&&'不能应用于'lambda expression'和'lambda expression'类型的操作数C:\ Users\Administrator\documents\visual studio 2012\Projects\TMS\TMS\Models\Repository.cs 914 24 TMS

Ser*_*kiy 9

你应该将单个lambda表达式传递给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);
Run Code Online (Sandbox Code Playgroud)

注意:您不需要在每个运算符中分配新的参数名称 - 这些范围不会重叠.

另外不要忘记声明性查询语法,它更具可读性(恕我直言),并且根本不会使用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;
Run Code Online (Sandbox Code Playgroud)