Linq - left join on multiple conditions

2744 ワード

Linqを使用して、テーブル「T_DIM_NETWORK」とテーブル「T_IDAU_DIAGNOSIS」を左に結合する方法(左に結合する条件は「StructId」、「DtuId」、「Subnet」、「NodeId」が等しい).
var queryDiag = from n in entity.T_DIM_NETWORK
    join d in entity.T_IDAU_DIAGNOSIS on
        new {structId = n.StructId, dtuId = n.DtuId, subnet = n.Subnet, nodeId = (int?) n.NodeId} equals
        new {structId = d.StructId, dtuId = d.DtuId, subnet = d.Subnet, nodeId = d.NodeId} into nd
    from id in nd.DefaultIfEmpty()
    where n.StructId == structId
        && n.DtuId == dtuId
        && n.Enable
    select new
    {
        networkId = n.ID,
        nodeId = n.NodeId,
        di = n.DI, //     ,   
        diu = n.DIU, //       ,     
        wakeDelay = n.WakeDelay,
        diagName = id.T_DIM_IDAU_DIAGNOSIS_ATTRIBUTES.name,
        diagResult = id.DiagResult,
        diagTime = id.DiagTime
    };

説明:
表「T_DIM_NETWORK」の「NodeId」タイプは(int,not null)であり、「T_IDAU_DIAGNOSIS」表の「NodeId」タイプは(int,null)であるため、データ型を揃えるためにlinq文の「equals」左側の「n.NodeId」の前に「(int?」を付ける必要がある空のタイプ変換が可能です.それ以外の場合、次のコンパイルエラーメッセージが表示されます.
The type arguments cannot be inferred from the query.(クエリーからタイプパラメータを推定できません)
エラーの原因:
You are getting this error because the types on either side of the "equals"clause do not match.すなわち、equalsの両方のデータ型が一致しないとエラーが発生します.
 
【まとめ】
LINQで「join on」マルチ条件ペアリングを使用して「LEFTJOIN」機能を生成する場合、equalsの両方のパラメータフィールド名の大文字と小文字、データ型が完全に一致しなければならない.そうしないと、「The type arguments cannot be inferred from the query.」コンパイルエラー.
  
附:from a from b左連文法
from a in tablea
from b in tableb
.Where( wb => ( a.col1 == wb.col1 || a.col2 == wb.col2)) // (parameter) tableb wb
.DefaultIfEmpty()
select new { col1 = a.col1, col2 = a.col2 }

   
【引用】https://social.msdn.microsoft.com/Forums/zh-CN/e09b50af-5ab4-4cfb-9617-ef2be339c17f/join-on-multiple-conditions?forum=linqprojectgeneral
           http://stackoverflow.com/questions/1264993/linq-left-join-on-multiple-or-conditions