Vous pouvez faire un champ à plusieurs rejoindre dans LINQ comme ceci:
var List1 = new List<Class1>();
List1.Add(new Class1 { Field1 = 1, Field2 = 2 });
List1.Add(new Class1 { Field1 = 3, Field2 = 4 });
var List2 = new List<Class2>();
List2.Add(new Class2 { Field1 = 1, Field2 = 2 });
List2.Add(new Class2 { Field1 = 5, Field2 = 6 });
var results = List1.Join(List2,
l1 => new {l1.Field1, l1.Field2},
l2 => new {l2.Field1, l2.Field2},
(l1, l2) => new {List1 = l1, List2 = l2});
La clé ici étant le 2 lambdas l1 => new {l1.Field1, l1.Field2}
et l2 => new {l2.Field1, l2.Field2}
. Ceux-ci créent des objets anonymes pour les lignes de chaque table qui contiennent les deux champs qui vous intéressent. La jointure ne réussit que lorsque les deux objets anonymes sont égaux.
Le 3ème lambda de là crée simplement l'objet qui est retourné comme valeur "jointe". Vous pouvez cependant créer n'importe quelle forme, celle-ci crée simplement un objet contenant les propriétés .Class1
et .Class2
contenant les lignes correspondantes de chaque liste. Vous pouvez l'aplanir si vous le souhaitez et/ou ajouter des propriétés supplémentaires dont vous avez besoin.
Tous les détails sur cette syntaxe sont disponibles sur la page de MSDN au joins using composite keys.
J'ai utilisé les 2 classes de figurante suivantes:
class Class1
{
public int Field1 { get; set; }
public int Field2 { get; set; }
}
class Class2
{
public int Field1 { get; set; }
public int Field2 { get; set; }
}
Un fichier LINQPad est disponible here.
Ce n'est pas une requête sql valide –
S'agit-il simplement de la partie JOIN? Vous devez poster toute la requête. – dpdragnev
je sais. Je viens de couper le reste de, et j'ai juste besoin de cette ligne –