无法在MongoDB

时间:2016-01-15 17:22:08

标签: c# mongodb linq

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

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

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

  

类型&#39; System.InvalidOperationException&#39;的第一次机会异常。发生在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,为什么在对字符串值进行硬编码时它会正常工作?编译器是否在做一些奇怪的事情来优化代码?我不知道这样的优化,但我认为这是可能的。

1 个答案:

答案 0 :(得分:2)

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

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

您可以使用演员表({{​​3}}),所以......

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

如果没有与Mongo团队一起出票。