我正在尝试在Find
上执行IMongoCollection<CreditEntry>
查询,并简单比较两个整数属性。我为此使用C#MongoDB.Driver 2.5.1。
CreditEntry
类包含以下两个整数字段:UsedCredits
和TotalCredits
,看起来像这样(简化):
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();
此查询完全有效,而比较两个字段则无效。为什么一个导致异常而另一个却没有异常呢?