C# 无法从MongoDB将LINQ查询中的字符串转换为int

C# 无法从MongoDB将LINQ查询中的字符串转换为int,c#,mongodb,linq,C#,Mongodb,Linq,因此,我正在执行一个SelectMany查询,以遍历集合中对象内部的列表。我的问题是: var collection = _database.GetCollection<VehicleDataUpload>(VehiclesCollection); var aggregation = collection.AsQueryable() .SelectMany(v => v.VehicleEntries) .Where(i => Convert.ToInt32

因此,我正在执行一个SelectMany查询,以遍历集合中对象内部的列表。我的问题是:

var collection = _database.GetCollection<VehicleDataUpload>(VehiclesCollection);
var aggregation = collection.AsQueryable()
    .SelectMany(v => v.VehicleEntries)
    .Where(i => Convert.ToInt32(i.PostFlashDTCs) > 0)
    .ToList();
而且它仍然运行良好。我的同事说转换字符串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字段的有效数字字符串,因此问题在于convert函数,而不是无效字符串

编辑3


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

mongo驱动程序将构建为表达式树的linq表达式转换为mongo自己的本地查询语言。错误的原因是它不知道如何将convert.ToInt32转换为convert.ToInt32

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

您可能可以使用cast()以便


如果不向Mongo团队提出问题。

你/你能调试以确保值为“0”吗?@MichaelB我用一个TryParse迭代到控制台以打印出一个错误值,但从未打印过。我将进行编辑以显示我所做的。但是,当我在
Convert.ToInt32(“1”)
中硬编码时,它为什么会工作?当它被硬编码为Linq并将Convert.ToInt32(“1”)转换为1时,它将工作,然后将该值传递给Mongo,Mongo可以处理该值。问题是,如果您要求Mongo运行Convert.ToInt32,它不知道该函数是什么,但C#不允许您这样强制转换int,您需要转换。请查看删除.AsQueryable()并使用.Find直接在集合中查找我会看一看。我可以用C#driver实现这一点,但我真的希望以某种方式将其切换到LINQ。
foreach (VehicleEntry vehicle in aggregation1)
{
    int result;
    if (!Int32.TryParse(vehicle.PostFlashDTCs, out result))
    {
        Console.WriteLine("Bad value!");
    }
}
.Where(i => (int)i.PostFlashDTCs > 0)