我有一个类属性名称作为字符串变量,想在 LINQ 查询中使用它。下面的例子:
public class Demo
{
public string prop1 {get; set;}
public string prop2 {get; set;}
public string prop3 {get; set;}
}
我能做到
var data = db.Single<Demo>(d => d.prop1 == "value");
但是不知道运行时的属性是什么,并获取像这样的字符串参数
string propname = "prop2";
是否有可能在 lambda 表达式 d => d.propname == "value"
中使用它?我不确定它是否可以并且在逻辑上似乎是不可能的。所以想到发布一个问题,看看是否有办法。请提出建议。
请注意,Single()
调用发生在 MongoDB C# Driver
上,因此不确定反射是否有效。
最佳答案
(这是在意识到反射在这种特殊情况下无济于事之前提供的原件。请参阅下面的编辑以获取更新的答案)
如果你不介意使用反射,你可以这样做:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
编辑
正如其他人在评论中暗示的那样,要使用 MongoDB 进行这项工作,您必须“手动”构建表达式。
所以,如果我采用以下语句:
var data = db.Single<Demo>(d => d.prop1 == "value");
我相信下面应该是等价的,但是是手动构建 lambda 表达式:
string propname = "prop1"; // you can now change this to any valid property name.
var parameterExpresion = Expression.Parameter(typeof(Demo), "d");
var binaryExpression = Expression.Equal(
Expression.Property(parameterExpresion, propname),
Expression.Constant("value"));
var lambda = Expression.Lambda<Func<Demo, bool>>(binaryExpression, parameterExpresion);
var data = db.Single<Demo>(lambda);
... 除了现在,您应该能够将 propname
的值更改为任何有效的属性名称,它应该可以正常工作。
在手动构建 lambda 时,看看代码变得多么冗长,这真的帮助我理解了在我们没有注意到的情况下发生的所有编译器魔法。
关于c# - 在 LINQ lambda 表达式中使用字符串变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799079/