簡體   English   中英

C#Mongo DB驅動程序-帶有方法調用的表達式不起作用

[英]C# Mongo DB driver - expression with method call not working

我正在嘗試通過發送表達式(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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM