Ich möchte eine dynamische Abfrage erstellen, konnte jedoch nicht das erforderliche Ergebnis erzielen. Bitte beachten Sie den folgenden Code. Ich habe versucht, zwei verschiedene Ansätze zu verwenden.
Ich möchte das gleiche Ergebnis sowohl von "resultUsingLing" als auch von "resultUsingDynamicLinq" erhalten. Das ErgebnisUsingDynamicLinq gibt keinen Wert zurück.
public class Test
{
public string Name { get; set; }
public string Address { get; set; }
}
public class Program
{
public static void Main()
{
List<Test> testList = new List<Test>()
{
new Test() { Address = "Address", Name = "Name" },
new Test() { Address = "Address1", Name = "Name1" },
new Test() { Address = "Address2", Name = "Name2" },
new Test() { Address = "Address3", Name = "Name3" },
new Test() { Address = "Address4", Name = "Name4" }
};
IQueryable<Test> queryableTestData = testList.AsQueryable<Test>();
var resultUsingLing= queryableTestData.Where(x => x.Address.Equals("Address1"));
string property = "Address";
string value = "Address1";
var type = typeof(Test);
var pe1 = Expression.Parameter(type, "p");
var propertyReference = Expression.Property(pe1, property);
var constantReference = Expression.Constant(value);
var resultUsingDynamicLinq= Expression.Lambda<Func<Test, bool>>
(Expression.Equal(propertyReference, constantReference),
new[] { pe1 }).Compile();
}
}
Das liegt daran, dass Sie den Ausdruck, den Sie erstellt haben, nirgendwo verwenden.
Und übrigens sollten Sie es nicht kompilieren. Durch die Kompilierung erhalten Sie Func<Test, bool>
, wodurch Ihr Where
Aufruf IEnumerable.Where
und nicht IQueryable.Where
.
var expression = Expression.Lambda<Func<Test, bool>>
(Expression.Equal(propertyReference, constantReference),
new[] { pe1 });
var resultUsingDynamicLinq = queryableTestData.Where(expression).ToList();