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 節を適用した後にのみ、2 番目の .Where() を適用しますか?

2番目の質問、すべてのチェックを1つの.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 演算子 '&&' は、型 'ラムダ式' および 'ラムダ式' のオペランドに適用できません C:\Users\Administrator\documents\visual studio 2012\Projects\TMS\TMS\Models\Repository.cs 914 24 TMS

4

1 に答える 1

10

単一のラムダ式を 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);

注: 各演算子でパラメーターの新しい名前を割り当てる必要はありません。これらのスコープは重複しません。

また、より読みやすく (IMHO)、ラムダをまったく使用しない宣言型クエリ構文についても忘れないでください。

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 に答える