将表达式传递到lambda中
本文关键字:lambda 表达式 | 更新日期: 2023-09-27 18:27:49
我有这样的类:
public class SomeClass
{
public string Text1 { get; set; }
public string Text2 { get; set; }
public int Number { get; set; }
}
我有这个类对象的列表:
List<SomeClass> myList = new List<SomeClass>();
我想使用LINQ(lambda语法)查询此列表:
var result = myList.Where(obj => obj.Text1 == "SomeString");
有没有任何方法可以传递属性(例如,通过字符串名称),我希望通过它来执行这个LINQ查询?在本例中,我按Text1属性进行搜索,但假设我想在Text1或Text2上动态调用此搜索(在运行时确定)。我希望能够传递执行此搜索的属性名称,并检查此属性是否为字符串,这样我就可以确保首先执行此搜索。
这可能吗?我知道反射和表达与此有关,但我不太了解它们。
感谢
使用反射的方法:
var result = myList.Where(obj => obj.GetType()
.GetProperty("Text1")
.GetValue(obj)
.Equals("SomeString"));
通过这种方式,您可以将"Text1"
属性更改为"Text2"
属性。
您可以使用动态linq:的另一种方法
var result = myList.AsQueryable().Where("Text1=@0", "SomeString");
动态LINQ也可以通过nuget获得。
您可以使用表达式树吗?
string memberName = "Text1", value = "SomeString";
var p = Expression.Parameter(typeof(SomeClass), "obj");
var predicate = Expression.Lambda<Func<SomeClass, bool>>(
Expression.Equal(
Expression.PropertyOrField(p, memberName),
Expression.Constant(value,typeof(string))
), p);
var result = myList.AsQueryable().Where(predicate);
或最后一行的备选方案:
var result = myList.Where(predicate.Compile());