using System.Collections.Generic;
public static void Main()
List<xType> theX = new List<xType> { new xType { a = 1, b = 2, n = 3, z = 7},
new xType { a = 2, b = 3, n = 2, z = 2},
new xType { a = 1, b = 2, n = 4, z = 7},
new xType { a = 1, b = 2, n = 5, z = 2},
List<yType> theY = new List<yType> { new yType { a = 1, b = 5, c = 3},
new yType { a = 2, b = 2, c = 2},
new yType { a = 1, b = 5, c = 4},
List<pType> theP = new List<pType> { new pType { a = 1, b = 5, z = 3},
new pType { a = 2, b = 2, z = 2},
new pType { a = 1, b = 5, z = 4},
List<dType> theD = new List<dType> { new dType { a = 1, b = 5, z = 7},
new dType { a = 2, b = 2, z = 7},
new dType { a = 1, b = 5, z = 5},
int[] myN = new int[] {3, 4};
var result = from typeX in theX
join typeY in theY on typeX.a equals typeY.a
join typeP in theP on typeX.b equals typeP.b where myN.Contains(typeX.n)
join typeD in theD on typeX.z equals typeD.z