c# - 在 LINQ lambda 表达式中使用字符串变量

标签 c# mongodb linq mongodb-.net-driver

我有一个类属性名称作为字符串变量,想在 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/

相关文章:

node.js - 蒙哥错误: must have $meta projection for all $meta sort keys using Mongo DB Native NodeJS Driver

c# - 如何合并两个不同对象的列表?

c# - 如何加入 2 个列表,其中一个列表包含 2 个元素?

c# - Xamarin 和 native 库

c# - 获取我的 C# 应用程序的版本?

mongodb - 如何修复错误找不到模块 'core-js/es6'

c# - 我正在使用 linq,但收到错误 "There is already an open datareader associated with this command which must be closed first"

c# - SQL Server CE 抛出不兼容异常

c# - 如何找到哪个类别属于只有标题的报价?

macos - 在 mac os 上配置启动代理以启动 mongo db 失败,并出现模糊的套接字错误