2016-04-15 22 views
2

Ich habe eine Abfrage, die eine Liste meiner Klasse auswählt. Es sieht so aus:LINQ Wählen Sie auf verschiedenen Variablen eindeutig

IQueryable<ClaimsBySupplierAggregate> agg = 
    (from d in alliance.SupplierSearchByReviewPeriod 
    where d.ClientID == ClientID && ReviewPeriodIDs.Contains((int)d.ReviewPeriodID) 

    select new ClaimsBySupplierAggregate { 
     Amount = d.Amount, 
     StatusCategoryID = d.StatusCategoryID, 
     DeptName = d.DepartmentName, 
     APLReason = d.APLReason, 
     Area = d.AreaDesc, 
     StatusCategoryDesc = d.StatusCategoryDesc, 
     Agreed = d.Agreed 
    }); 

Später in der Anwendung, die ich jede Variable auswählen und die unterschiedlichen Werte wie diese:

SupplierModel.APLReason = agg.Select(r => r.APLReason).Distinct().ToList(); 
SupplierModel.AreaDesc = agg.Select(r => r.Area).Distinct().ToList(); 
SupplierModel.DeptName = agg.Select(r => r.DeptName).Distinct().ToList(); 
SupplierModel.StatCatDes = aggg.Select(r => r.StatusCategoryDesc).Distinct().ToList(); 

Gibt es eine Möglichkeit, dies in einer LINQ-Anweisung zu tun?

+0

Es tut mir leid, ich habe nicht die ganze Methode eingefügt. Ich werde –

+1

ammend Ich sehe nicht, dass Sie den eindeutigen Wert überall erhalten. Dein Code erhält alle Werte – Rob

+0

Ich denke er meint "anders", nicht "verschieden" :-) – Jcl

Antwort

2

Sie könnten Aggregat verwenden, aber Sie benötigen ein komplexes Objekt für den Seed, das Sie zur gleichen Komplexität des Codes bringt. Ich denke, dass in diesem speziellen Fall die Verwendung von LInQ in den Golden Hammer Antipattern eintritt. Verwenden Sie einfach eine altmodische Schleife und vier HashSets statt Listen und Sie sind fertig und der Code ist lesbarer und Ihre Absicht klarer.

0

Ich denke, dass Sie dies verwenden können dann passen Sie den Code folgen Sie Ihren Erwartungen. Oder Sie können die Gruppe nach verwenden.

public class LinqTest 
    { 
     public int id { get; set; } 
     public string value { get; set; } 

     public override bool Equals(object obj) 
     { 
      LinqTest obj2 = obj as LinqTest; 
      if (obj2 == null) return false; 
      return id == obj2.id; 
     } 

     public override int GetHashCode() 
     { 
      return id; 
     } 
    } 

    List<LinqTest> uniqueIDs = myList.Distinct().ToList(); 
0

Es ist eine erfundene Art und Weise, dies zu tun:

from d in alliance.SupplierSearchByReviewPeriod 
where d.ClientID == ClientID && ReviewPeriodIDs.Contains((int)d.ReviewPeriodID) 
group d by 0 into g 
select new 
{ 
    APLReasons = g.Select(d => d.APLReason).Distinct(), 
    AreaDescs = g.Select(d => d.Area).Distinct(), 
    DeptNames = g.Select(d => d.DeptName).Distinct(), 
    StatusCategoryDescs = g.Select(d => d.StatusCategoryDesc).Distinct(), 
} 

Der Teil group d by 0 into g schafft eine Gruppe aller Elemente, aus denen Sie anschließend jedes Aggregat abfragen können Sie wollen.

ABER ...

... das schafft eine sehr ineffiziente Abfrage mit UNION s und (natürlich) DISTINCT s. Es ist wahrscheinlich besser (in Bezug auf die Leistung), einfach die flachen Daten aus der Datenbank zu holen und die Aggregationen im nachfolgenden Code durchzuführen.