Access property in lambda expression from string when using LINQ

后端 未结 4 999
渐次进展
渐次进展 2021-01-03 04:40

How can I do something like this:

var result = db.MyTable.Where(x => x.\"MyProperty\" == \"Test\" );

As you can see I want to access \"MyProperty\" but

4条回答
  •  -上瘾入骨i
    2021-01-03 04:55

    You could use reflection

    x.GetType( ).GetProperty("MyProperty").GetValue( x, null ); 
    

    although this might work, i wouldn't advise on doing this, why don't pass in your where clause as an expression like:

    myMethod(Expression> where)
    

    example after comment:

    consider the following type:

    you see there are three properties where the name is of type string and id is of type int. now if we wrap our database context in a service like this

    public class MyTypeOfXService
    {
        private DataDataContext Context;
        public MyTypeOfXService()
        {
            Context = new DataDataContext("example code");
        }
    
        public IQueryable GetTypeOfX(Expression> where)
        {
            return this.Context.MyTypeOfXes.Where(where);
        }
    }
    

    in our get method there is an Expression parameter that takes two generics, the first is our type x and the second is a boolean. The advantage of this approach is that we can abstract all the data context creation and only express an where clause in our code see final piece of code:

    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);
        }
    }
    

    as you can see, we can build a where clause on any property or combination of properties.

提交回复
热议问题