gpt4 book ai didi

C# Mongodb 驱动程序 - 带有方法调用的表达式不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 22:23:59 26 4
gpt4 key购买 nike

我正在尝试查询一些数据并通过发送表达式(C# mongo 驱动程序版本 2.7.3)投影到属性较少的类。我试图理解为什么特定表达式失败。失败极大地限制了用户编写通用投影,并迫使他在每次调用中都以内联方式编写投影。这是一个简化的例子:

private IMongoCollection<MyOriginalClass> _collection;

class MyOriginalClass // imagine this class has many more properties
{
public int ID { get; set; }
}

class MyProjectedClass
{
public int ID { get; set; }
}

void DoWork()
{
var data1 = GetData(lib => new MyProjectedClass { ID = lib.ID }); // succeeds
var data2 = GetData(lib => ToProjected(lib)); // Fails in mongo driver: Index was out of range. Must be non-negative and less than the size of the collection.Parameter name: index
}

IEnumerable<MyProjectedClass> GetData(Expression<Func<MyOriginalClass, MyProjectedClass>> projection)
{
return _collection
.Aggregate()
.Project(Builders<MyOriginalClass>.Projection.Expression(projection))
.ToList();
}

MyProjectedClass ToProjected(MyOriginalClass orig)
{
return new MyProjectedClass {ID = orig.ID};
}

最佳答案

第一个(成功)用法是一个表达式,mongo 驱动程序可以在运行时查看该表达式以了解 ID = lib.ID。具体这里是NewExpression .

例如Visual Studio 允许在调试器下进行表达式可视化,对于第一个它显示:

.Lambda #Lambda1<System.Func`2[ConsoleApp1.Program+MyOriginalClass,ConsoleApp1.Program+MyProjectedClass]>(ConsoleApp1.Program+MyOriginalClass $lib)
{
.New ConsoleApp1.Program+MyProjectedClass(){
ID = $lib.ID
}
}

第二次(失败)使用是一个表达式,仅调用 ToProjected,ToProjected 被编译到 IL 中,并且在运行时 mongo 驱动程序无法检索 ID = lib.ID 的知识(至少不是以这种简单的方式与表达式一样)。具体这里是MethodCallExpression .而第二个表达式的可视化是:

.Lambda #Lambda1<System.Func`2[ConsoleApp1.Program+MyOriginalClass,ConsoleApp1.Program+MyProjectedClass]>(ConsoleApp1.Program+MyOriginalClass $lib)
{
.Call ConsoleApp1.Program.ToProjected($lib)
}

ToProject 可以重写为:

Expression<Func<MyOriginalClass, MyProjectedClass>> ToProjected()
{
return lib => new MyProjectedClass { ID = lib.ID };
}

并用作:

var data2 = GetData(ToProjected());

关于C# Mongodb 驱动程序 - 带有方法调用的表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55690727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com