6

我想检索所有具有 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 运算符“&&”不能应用于“lambda 表达式”和“lambda 表达式”类型的操作数 C:\Users\Administrator\documents\visual studio 2012\Projects\TMS\TMS\Models\Repository.cs 914 24 TMS

4

1 回答 1

10

您应该将单个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);

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

也不要忘记声明性查询语法,它更具可读性(恕我直言)并且根本不会使用 lambda:

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;
于 2013-10-25T23:21:16.160 回答