1

我有这样的课:

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(在运行时确定)上动态调用此搜索。我希望能够传递执行此搜索的属性名称,并检查此属性是否为字符串,以便我确定可以首先执行此搜索。

那可能吗?我知道 Reflections 和 Expressions 与它有关,但我不太了解它们。

谢谢

4

2 回答 2

1

使用反射的方法:

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 获得

于 2013-08-14T11:04:10.903 回答
1

你可以使用表达式树吗?

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());
于 2013-08-14T11:06:26.083 回答