Rah*_*hul 2 c# linq mongodb mongodb-.net-driver
我有一个类属性名称作为字符串变量,并希望在 LINQ 查询中使用它。下面的例子:
public class Demo
{
public string prop1 {get; set;}
public string prop2 {get; set;}
public string prop3 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我可以做这个
var data = db.Single<Demo>(d => d.prop1 == "value");
Run Code Online (Sandbox Code Playgroud)
但不知道运行时的属性是什么并获取该字符串参数,例如
string propname = "prop2";
Run Code Online (Sandbox Code Playgroud)
有没有可能在 lambda 表达式中使用它d => d.propname == "value"?我不确定它可以,而且在逻辑上似乎不可能。所以想到发布一个问题,看看是否有办法。请建议。
请注意,该Single()调用正在发生MongoDB C# Driver,因此不确定反射是否有效。
(这是在意识到反射在这种特殊情况下无济于事之前提供的原始内容。请参阅下面的编辑以获取更新的答案)
如果你不介意使用反射,你可以这样做:
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d));
Run Code Online (Sandbox Code Playgroud)
编辑
正如其他人在评论中暗示的那样,要使这项工作与 MongoDB 一起使用,您必须“手动”构建表达式。
所以,如果我采取以下声明:
var data = db.Single<Demo>(d => d.prop1 == "value");
Run Code Online (Sandbox Code Playgroud)
我相信以下内容应该是等效的,但要手动构建 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);
Run Code Online (Sandbox Code Playgroud)
...除了现在,您应该能够将 的值更改propname为任何有效的属性名称,并且它应该可以正常工作。
看看在手动构建 lambda 时代码变得多么冗长,真的帮助我理解了在我们没有注意到的情况下发生的所有编译器魔法。
| 归档时间: |
|
| 查看次数: |
1873 次 |
| 最近记录: |