c# – 无法在MongoDB的LINQ查询中将字符串转换为int

因此,我正在执行SelectMany查询以遍历集合中对象内的列表.这是我的查询:

var collection = _database.GetCollection<VehicleDataUpload>(VehiclesCollection);
var aggregation = collection.AsQueryable()
    .SelectMany(v => v.VehicleEntries)
    .Where(i => Convert.ToInt32(i.PostFlashDTCs) > 0)
    .ToList();

但是,每次运行此操作时都会出现以下错误:

A first chance exception of type ‘System.InvalidOperationException’ occurred in MongoDB.Driver.dll

我认为这个问题与转换函数有关,所以我把它改成了:

.Where(i => Convert.ToInt32("1") > 0)

它仍然工作正常.我的同事说它可能会在转换字符串0时窒息,但是当我在“0”中进行硬编码时,它仍然有效.由于某种原因,它只是无法转换类字段.我已将字段设置为字符串,甚至为其设置默认值:

public class VehicleEntry
{
    [BsonElement("PostFlashDTCs")]
    [BsonDefaultValue("0")]
    public String PostFlashDTCs { get; set; }
}

当我从对象本身读取时,它显示InvalidFormatException的原因是什么?

编辑

我写了一个快速for循环来迭代(在删除where步骤之后)并打印如果有一个字符串无法转换为整数.没有任何内容打印到控制台:

foreach (VehicleEntry vehicle in aggregation1)
{
    int result;
    if (!Int32.TryParse(vehicle.PostFlashDTCs, out result))
    {
        Console.WriteLine("Bad value!");
    }
}

编辑2

我限制了我的查询,以便从只有12个VehicleEntry元素的案例中提取.我之后放了一个调试器(我暂时移除了where case)并浏览了所有12个元素,它们都有PostFlashDTCs字段的有效数字字符串,所以问题在于转换函数,而不是无效的字符串.

编辑3

如果我无法在LINQ查询中使用Convert.ToInt32,为什么在我对字符串值进行硬编码时它会正常工作?编译器是否在做一些奇怪的事情来优化代码?我不知道这样的优化,但我想这是可能的.

最佳答案 mongo驱动程序将linq表达式构建为表达式树,并使用Mongo自己的本机查询语言对其进行转换.出错的原因是它不知道如何转换Convert.ToInt32.

.ToList()部分强制查询在Mongo上运行,之后linq语句将在应用程序中运行,您将能够在.ToList之后使用Convert.ToInt32.

你或许可以使用演员阵容(https://jira.mongodb.org/browse/CSHARP-900)……

.Where(i => (int)i.PostFlashDTCs > 0)

如果不与Mongo团队一起提票.

点赞