Forums Neueste Beiträge
 

LINQ to Objects Abfrage dynamisch zur Laufzeit generieren

30/09/2009 - 19:38 von janosch | Report spam
Hallo,
das Beispiel aus http://msdn.microsoft.com/de-de/lib...82637.aspx
habe ich wie folgt abgeàndert:

Type globObj = ssb.ssbGlobObj.Typ; //enthalten Angaben zum
Type der zur Laufzeit verwendeten Klasse
Dictionary<int, StayReference> dictStRF = qRF.DictSTRF; //
enthàlt die Objekte vom Typ StayReference und soll abgefragt werden

IQueryable<StayReference> queryableData dictStRF.Values.ToList().AsQueryable<StayReference>();

ParameterExpression pe = Expression.Parameter(globObj,
"stayRef");

Expression left = Expression.Property(pe,
globObj.GetProperty("CaseID", typeof(int)));
Expression right = Expression.Constant(13554, typeof
(int));
Expression e1 = Expression.Equal(left, right);

MethodCallExpression whereCallExpression = Expression.Call
(
typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<StayReference, bool>>(e1, new
ParameterExpression[] { pe }));

IQueryable<StayReference> results queryableData.Provider.CreateQuery<StayReference>
(whereCallExpression);

foreach (StayReference company in results)
listBox1.Items.Add(company.CaseID.ToString());

Soweit, so gut. Wie schaffe ich es jetzt aber, die Anfrage auf eine
mir vorher unbekannte Klasse zu starten? Also so, dass nicht mehr
überall StayRefence drin steht, sondern ich das erst zur Laufzeit
übergebe?
 

Lesen sie die antworten

#1 Frank Dzaebel
30/09/2009 - 19:50 | Warnen spam
Hallo Janosch,

der volle Vor- und Zuname als Username wird hier gern gesehen.

das Beispiel aus http://msdn.microsoft.com/de-de/lib...82637.aspx
habe ich wie folgt abgeàndert [...]
Soweit, so gut. Wie schaffe ich es jetzt aber, die Anfrage auf eine
mir vorher unbekannte Klasse zu starten?



Zum Beispiel generisch mit Interface formulieren:

private void Form1_Load(object sender, EventArgs e)
{
Test<StayReference>();
}

void Test<T>() where T : ICaseable
{
Type globObj = ssb.ssbGlobObj.Typ; //enthalten Angaben zum
//Type der zur Laufzeit verwendeten Klasse
Dictionary<int, T> dictStRF = qRF.DictSTRF; //
// enthàlt die Objekte vom Typ StayReference und soll abgefragt
werden

IQueryable<T> queryableData dictStRF.Values.ToList().AsQueryable<T>();

ParameterExpression pe = Expression.Parameter(globObj,
"stayRef");

Expression left = Expression.Property(pe,
globObj.GetProperty("CaseID", typeof(int)));
Expression right = Expression.Constant(13554, typeof(int));
Expression e1 = Expression.Equal(left, right);
MethodCallExpression whereCallExpression = Expression.Call
(
typeof(Queryable), "Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<T, bool>>(e1,
new ParameterExpression[] { pe }));

IQueryable<T> results queryableData.Provider.CreateQuery<T>
(whereCallExpression);

foreach (T result in results)
listBox1.Items.Add(result.CaseID.ToString());
}

interface ICaseable
{
/// <summary>Fall-Nummer</summary>
int CaseID { get; set; }
}

class StayReference : ICaseable
{
public int CaseID { get; set; }
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen