NKn*_*rer 4 c# linq string lambda properties
我该如何做这样的事情:
var result = db.MyTable.Where(x => x。“ MyProperty” ==“ Test”);
如您所见,我想访问“ MyProperty”,但将属性名称作为字符串。
您可以使用反射
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子句。