【问题标题】:Unable to convert string to int in LINQ query from MongoDB无法在来自 MongoDB 的 LINQ 查询中将字符串转换为 int
【发布时间】: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 进行了迭代,以打印到控制台的错误值,但它从未打印过。我将编辑以显示我所做的。

标签: c# mongodb linq


【解决方案1】:

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 团队提出请求。

【讨论】:

  • 但是当我在Convert.ToInt32("1") 中硬编码时为什么它会起作用?
  • 当它被硬编码为 Linq 并将 Convert.ToInt32("1") 转换为 1 然后将该值传递给 Mongo 可以处理的 Mongo 时,它将起作用。问题是如果你要求 Mongo 运行 Convert.ToInt32,它不知道那个函数是什么
  • 关于演员表的建议不错,但 C# 不会让你这样转换 int,你需要转换。
  • 看看删除 .AsQueryable() 并直接在集合上使用 .Find docs.mongodb.org/getting-started/csharp/query
  • 我去看看。我能够使用 C# 驱动程序做到这一点,但我真的希望以某种方式将其切换到 LINQ。
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多