動的クエリを作成したいのですが、必要な結果を取得できませんでした。以下のコードをご覧ください。私は2つの異なるアプローチを試してみました。
「resultUsingLing」と「resultUsingDynamicLinq」の両方から同じ結果を取得したい。 resultUsingDynamicLinqは値を返しません。
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();
}
}
これは、どこかで作成した式を使用していないためです。
ところで、コンパイルしないでください。コンパイルによってFunc<Test, bool>
が提供されます。これにより、 Where
呼び出しでIQueryable.Where
ではなくIEnumerable.Where
が使用されます。
var expression = Expression.Lambda<Func<Test, bool>>
(Expression.Equal(propertyReference, constantReference),
new[] { pe1 });
var resultUsingDynamicLinq = queryableTestData.Where(expression).ToList();