因此,我正在执行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团队一起提票.