2016-06-15 9 views
0

Ich verwende nhibernate Mapping von Code, ich diesen Ausdruck dynamicllay machen will (mit einem verschachtelten Objekt)Build-Linq groupby Ausdruck dynamisch mit verschachtelter Eigenschaft von String

ich eine Klasse Ereignis habe, die eine Beziehung viele hat man mit Ereignis-Zustand/und ich möchte durch Code in der Tabelle Event

var grouping = query.GroupBy(x => x.EventState.Code) 

Es ist für mich, hier mit einer einfachen Eigenschaft arbeitet, um die Gruppierung ist mein Code:

var arg = Expression.Parameter(type, categoryColumnName); 
var bodyy = Expression.Convert(Expression.Property(arg, categoryColumnName), typeof (object)); 
var lambdaGroupBy = Expression.Lambda<Func<Operation, object>>(bodyy, arg); 

var keySelector = lambdaGroupBy.Compile(); 
var grouping = query.GroupBy(keySelector); 
return grouping.Select(a => new PieChartObject { Category = a.Key.ToString(), Value = a.Count().ToString() }).ToList(); 

Aber ich kann nicht Mach es mit verschachtelten Objekten.

+0

Ich erstellen eine Eigenschaft in meinem Modell, die den Code aus der EventState-Tabelle enthalten, aber ich habe ein Leistungsproblem – SamirJ

+0

Was ist der Typ des verschachtelten Objekts? – Georg

+0

die Art von "Code" ist eine Zeichenfolge – SamirJ

Antwort

0

GroupBy partitioniert Ihre Abfrage nach dem, was Sie als Schlüsselauswahl bereitstellen. Um festzustellen, ob zwei Elemente in Ihrer Abfrage denselben Schlüssel haben, wird der Standardvergleich des angegebenen Typs verwendet. Für Objekt verwendet dies die Methoden Equals und GetHashCode, die wiederum für Strings bedeuten, dass der Inhalt der Strings identisch ist. Wenn Sie eine Klasse verwenden, wird standardmäßig die Referenzidentität verwendet, daher denke ich, dass GroupBy in Ihrem Fall nichts bewirkt, da die von Ihnen angegebenen Schlüssel nicht identisch sind, obwohl sie die gleichen Werte haben können.

Es gibt also zwei gültige Lösungen: Sie können entweder Equals und GetHashCode in Ihrer geschachtelten Objektklasse überschreiben, oder Sie können GroupBy einen benutzerdefinierten Schlüsselvergleicher bereitstellen, wenn Sie dieses Verhalten nur für diese bestimmte Abfrage wünschen. Aber ich denke, da Sie generisch sein möchten, wäre die Implementierung von Equals und GetHashCode eine bessere Option. Die einzige Ausnahme ist natürlich, wenn dies nicht möglich ist, z.B. weil es eine vom Compiler erzeugte Klasse ist. In diesem Fall gibt es nur wenige Dinge, die Sie tun können.

+0

Wie? ich verstehe nicht! – SamirJ

+0

Wie ??? Ich habe es nicht verstanden !! Meinst du Eigenschaft? Ich erstelle eine Eigenschaft in meinem Modell, die den Code aus der Tabelle EventState enthält, aber ich habe ein Performance-Problem – SamirJ

+0

@SamirJ Dieser Link kann helfen, Equals und GetHashCode zu überschreiben: https://msdn.microsoft.com /de-de/library/ms173147(v=vs.90).aspx – Georg