2017-10-12 4 views
1

j'ai besoin de tirer des enregistrements d'une base de données, supposons que cette structuretirer les enregistrements Distinct de DB en utilisant deux colonnes

ID, nom, type, clé, EXPDATE, IsActive

Maintenant certaine restructuration a été fait et il est possible que la table contienne des enregistrements en double basés sur l'ID et le type. Je veux être en mesure de tirer les enregistrements de la base de données en utilisant linq, mais seulement un des enregistrements qui ont le même ID/Type.

EX:

1, Fred, 1, NewGuid, 15/12/2019, 1

1, Fred, 1, NewGuid, 01/10/2017, 1

2, Goerge, 2, NewGuid, 02/01/2018, 1

Je veux que le jeu de résultats soit de 1 enregistrement pour Fred et One pour Goerge. Peu importe vraiment lequel des disques de Fred obtient le retour juste qu'un seul fait.

J'ai essayé d'utiliser DISTINCT, mais cela renvoie un IDistinct et non l'intégralité de l'enregistrement. Y a-t-il un moyen de le faire en utilisant linq?

Voici ce que j'ai essayé:

_table.AllReadOnly().Where(i => i.ID == id && i.IsActive).GroupBy(i => i.ID, i.Type).Select(i => i.FirstOrDefault()).ToList(); 
_table.AllReadOnly().Where(i => i.ID == id && i.IsActive).Distinct().ToList(); 

Je sais que le .Distinct() comme ça ne fera rien. J'ai essayé de trouver comment faire un EqualityComparer, mais je ne suis pas sûr que ce soit la voie que je devrais suivre.

Répondre

0

Vous pouvez utiliser GroupBy par ces deux colonnes, puis dans chaque groupe, sélectionnez le premier élément. Par exemple:

var list = new List<Table1>() 
{ 
    new Table1(){ Column1="x", Column2="y", Column3= "z"}, 
    new Table1(){ Column1="x", Column2="y", Column3= "t"}, 
    new Table1(){ Column1="a", Column2="b", Column3= "c"}, 
}; 

var resulut = list.GroupBy(x => new { C1 = x.Column1, C2 = x.Column2 }) 
        .Select(g => g.FirstOrDefault()); 

Et le résultat serait une liste contenant l'élément premier et troisième de la liste d'entrée.

+0

Merci, Cela a fonctionné. Je me demande pourquoi cela a fonctionné comme je l'ai eu. Le mien vient de renvoyer une liste . –

+0

De rien. Vous avez passé 'i.Type' comme sélecteur de résultat dans le groupe par signature. Vous n'en avez pas besoin. –