System.ArgumentException与C#MongoDB.Driver

时间:2019-05-17 10:00:13

标签: c# mongodb

我正在尝试在Find上执行IMongoCollection<CreditEntry>查询,并简单比较两个整数属性。我为此使用C#MongoDB.Driver 2.5.1。

CreditEntry类包含以下两个整数字段:UsedCreditsTotalCredits,看起来像这样(简化):

public class CreditEntry
{
    public CreditEntry(string username, int totalCredits)
    {
        Id = Guid.NewGuid();
        Username = username;
        UsedCredits = 0;
        TotalCredits = totalCredits;
    }

    public Guid Id { get; set; }
    public string Username { get; set; }
    public int UsedCredits { get; internal set; }
    public int TotalCredits { get; internal set; }
    public int Credits => TotalCredits - UsedCredits;
}

抛出System.ArgumentException应该能够找到用户的代码是(简体):

string username = "user1";
var user = _collection.Find(c => c.Username == username &&
                                 c.TotalCredits > c.UsedCredits).FirstOrDefault();

异常看起来像这样:

{
  "error":{
    "code":"","message":"An error has occurred.","innererror":{
      "message":"Unsupported filter: ({document}{TotalCredits} > {document}{UsedCredits}).","type":"System.ArgumentException"

我已经确保user1有一个CreditEntry,其中TotalCredits大于UsedCredits,并且该集合存在。

如果我执行此Find查询,则可以正常工作,但是缺少整数比较条件:

string username = "user1";
var user = _collection.Find(c => c.Username == username).FirstOrDefault();

所以,我的问题是:为什么我不能在此Find查询中比较CreditEntry的两个整数属性,并且可能还有其他方法可以实现这一点?

编辑:为什么接受Func作为Find方法的输入,在这里您可以在比较两个字段的同时将整数字段TotalCredits与特定的整数(例如10)进行比较不可能吗?

为了说明这一点:

var user = _collection.Find(c => c.TotalCredits > 0 && c.Tenant == tenant).FirstOrDefault();

此查询完全有效,而比较两个字段则无效。为什么一个导致异常而另一个却没有异常呢?

0 个答案:

没有答案