2016-04-04 12 views
0

Ich habe diesen Beitrag gefolgt: LINQ group by property as a parameter, um eine parametrisierbare Abfrage zu machen, und ich versuche jetzt, das gleiche nach einer Gruppierung nach Klausel, aber ich kann die Gruppe nicht richtig definieren/oder auf die Eigenschaften danach zugreifen. Hier ist, was ich versuche zu erreichen:linq parametrisierbare Gruppe von nach einer Join-Klausel

public Dictionary<string, float?> GetFundingByFilter<TKey>(Expression<Func<Object, TKey>> myGroupingProperty, Filter item) 
    { 

     int cntToBeSureThatTheQueryExecuteAtLeastOneTime = 0; 
     Dictionary<string, float?> countriesAndCount = new Dictionary<string, float?>(); 
     using (var db = new fintechDbContext()) 
       { 


        countriesAndCount = (from p in db.companyDBSET 
           join f in db.fundingDBSET on p.Company equals f.Company into d 
           from t in d.DefaultIfEmpty() 
           select new {p, t }) 
           .GroupBy(myGroupingProperty) 
           .Select(r => new { Value = r.Key, Sum = r.Sum(d => d == null ? 0 : d.t.Amount) }) 
           .OrderByDescending(y=>y.Sum) 
           .ToDictionary(v => v.Value.ToString(), v => v.Sum); 



       } 
      } 
     } 
     return countriesAndCount; 
    } 

aber d.t.Amount nicht mehr zugänglich ist in diesem Fall.

+0

Das Problem ist ** Objekt ** innerhalb von 'Expression >'. Selbst wenn du es irgendwie kompilierst, wie denkst du, kannst du es nennen? –

Antwort

1

Nun ja, eine Sache, die Sie tun können, ist eine benutzerdefinierte Klasse erstellen (a DTO), um die Projektion Ihrer Abfrage zu speichern, nachdem Sie die Join:

// Instead of save both instances, you can define this class with only the properties you need from both entities 
public class CompanyFundingDTO 
{ 
    public Company Company {get;set;} 
    public Funding Funding {get;set;} 
} 

Dann in Ihrer Methode ändern Object von CompanyFundingDTO:

public Dictionary<string, float?> GetFundingByFilter<TKey>(Expression<Func<CompanyFundingDTO, TKey>> myGroupingProperty, Filter item) 
{ 
     //... 
     countriesAndCount = (from p in db.companyDBSET 
          join f in db.fundingDBSET on p.Company equals f.Company into d 
          from t in d.DefaultIfEmpty() 
          select new CompanyFundingDTO{Company=p,Funding= t })//Project this way 
          .GroupBy(myGroupingProperty) 
          .Select(r => new { Value = r.Key, Sum = r.Sum(d => d == null ? 0 : d.Funding.Amount) } 
          .OrderByDescending(y=>y.Sum) 
          .ToDictionary(v => v.Value.ToString(), v => v.Sum); 
     //... 
} 

Jetzt können Sie Ihre Methode übergeben den ersten Parameter nennen wie ich weiter unten zeigen:

var result= instance.GetFundingByFilter(ct=>ct.Company.SomeCompanyProperty,...); 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu beantworten! Scheint jetzt albern :) –