使用LINQ时从字符串访问lambda表达式中的属性

NKn*_*rer 4 c# linq string lambda properties

我该如何做这样的事情:

var result = db.MyTable.Where(x => x。“ MyProperty” ==“ Test”);

如您所见,我想访问“ MyProperty”,但将属性名称作为字符串。

Did*_*ron 6

您可以使用反射

x.GetType( ).GetProperty("MyProperty").GetValue( x, null ); 
Run Code Online (Sandbox Code Playgroud)

尽管这可能行得通,但我不建议这样做,为什么不将您的where子句作为表达式传递:

myMethod<T>(Expression<Func<T,bool>> where)
Run Code Online (Sandbox Code Playgroud)

评论后的示例:

考虑以下类型:

您会看到三个属性,其中名称为string类型,id为int类型。现在,如果我们将数据库上下文包装在这样的服务中

public class MyTypeOfXService
{
    private DataDataContext Context;
    public MyTypeOfXService()
    {
        Context = new DataDataContext("example code");
    }

    public IQueryable<MyTypeOfX> GetTypeOfX(Expression<Func<MyTypeOfX, bool>> where)
    {
        return this.Context.MyTypeOfXes.Where(where);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我们的get方法中,有一个Expression参数带有两个泛型,第一个是我们的类型x,第二个是布尔值。这种方法的优点是我们可以抽象所有数据上下文创建,而只在代码中表达where子句,请参见最后一段代码:

class Program
{
    static void Main(string[] args)
    {
        var service = new MyTypeOfXService();

        var queryById = service.GetTypeOfX((mytype) => mytype.Id == 1);
        var queryByName = service.GetTypeOfX((mytype) => mytype.Name == "MyName");
        var queryByName = service.GetTypeOfX((mytype) => mytype.Name == "MyName" && mytype.Id == 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我们可以在任何属性或属性组合上构建where子句。