【发布时间】:2016-01-15 17:22:08
【问题描述】:
所以,我正在执行一个 SelectMany 查询来遍历集合中对象内部的列表。这是我的查询:
var collection = _database.GetCollection<VehicleDataUpload>(VehiclesCollection);
var aggregation = collection.AsQueryable()
.SelectMany(v => v.VehicleEntries)
.Where(i => Convert.ToInt32(i.PostFlashDTCs) > 0)
.ToList();
但是,每次我运行它时,我都会收到以下错误:
在 MongoDB.Driver.dll 中发生了“System.InvalidOperationException”类型的第一次机会异常
我认为问题与转换功能有关,所以我将其更改为:
.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 大小写)并检查了所有 12 个元素,它们都有 PostFlashDTCs 字段的有效数字字符串,所以问题出在转换函数上,而不是无效字符串。
编辑 3
如果我无法在 LINQ 查询中使用 Convert.ToInt32,为什么在我硬编码字符串值时它可以正常工作?编译器是否在做一些奇怪的事情来优化该代码?我不知道这种优化,但我想这是可能的。
【问题讨论】:
-
您/您是否可以调试以确保该值为“0”?
-
@MichaelB 我使用 TryParse 进行了迭代,以打印到控制台的错误值,但它从未打印过。我将编辑以显示我所做的。