【问题标题】:Comparison operators not support for 'System.String[]' in a Linq query比较运算符不支持 Linq 查询中的“System.String[]”
【发布时间】:2014-02-12 19:06:57
【问题描述】:

我正在做一个 Linq 查询来连接两个表中的数据(使用 Linq to SQL),逻辑如下:

  • 横幅包含一个包含逗号分隔值的字段。我想拆分此列并拥有一个 ID 列表(例如 1、2、3、4)
  • References 包含这些映射的列表,其中横幅中的 ID 与参考表中的 ID 之间的映射为 1:1
  • 表合并后,我想返回引用表中的描述,即 ID 的文本表示。

我一直在摆弄这个,但碰上了一堵砖墙。下面是我正在使用的代码(在 LinqPad 中):

var results = (from b in Banners
         where b.BannerCode == "1234"
         from a in b.VesselBoatAreaY.Split (',').AsEnumerable()
         join r in References on a equals r.ReferenceCode
         where r.Context == "TestContext" 
         select r.Description).ToList();

我已确认查询的第一部分有效,即横幅代码存在并返回 4 个单独的值。当我作为一个整体运行查询时,我得到以下信息:

NotSupportedException 类型“System.String[]”不支持比较运算符。

我还尝试了以下方法:

var results = (from b in Banners
               where b.BannerCode == "1234"
               from a in b.VesselBoatAreaY.Split (',').AsEnumerable()
               from r in References
               where r.Context == "TestContext" &&
               a.Contains(r.ReferenceCode)
               select r.Description).ToList();

当我运行它时,我得到以下信息:

参数异常
参数“值”是错误的类型。应为“System.String”。实际的'System.String[]'。

任何帮助表示赞赏!

【问题讨论】:

  • 不能在 Linq 中使用 .NET 方法并期望它们在 EF 尝试创建 SQL 查询时“正常工作”。这是一组非常具体的方法,可以被翻译。见msdn.microsoft.com/en-us/library/bb738550(v=vs.110).aspx
  • 嗨,我应该说 - 我没有使用 EF,我使用的是 LinqToSQL。正是出于这个原因,我避免使用 EF。
  • 这同样适用于 LinqToSql 或任何其他 LINQ 提供程序。
  • 是什么阻止您在 SQL 中编写此查询?
  • @mayer06 我试图避免像存储过程这样的事情——我想在 C# 中这样做

标签: c# linq linq-to-sql


【解决方案1】:

感谢大家的帮助。我已经解决了这个问题,实际上很容易。由于我正在阅读的表格非常小​​,我可以将 AsEnumerable 应用于 Banners 表格并且它工作正常。我意识到这意味着它将在内存中进行处理,因此它不适合更大的表,但它可以满足我的需要。

现在的代码供参考:

var results = (from b in Banners.AsEnumerable()
               where b.BannerCode == "1234"
               from a in b.VesselBoatAreaY.Split (',')
               from r in References.AsEnumerable()
               where r.Context == "TestContext" &&
               a.Contains(r.ReferenceCode)
               select r.Description).ToList();

【讨论】:

  • 我很惊讶这能行得通,因为 L2S 没有 support String.Split。我的猜测是AsEnumerable 调用会在执行之前切换连接的上下文(这更奇怪,因为它被称为 after Split)。我会对这个查询的 SQL 的样子感兴趣。
  • 我已经通过 SQL 分析器运行它,它首先读取横幅内容,然后将所有参考内容作为单独的查询读取,因此它似乎只是将其加载到内存中并在那里处理。
  • 啊,刚刚意识到你在Banners 部分有AsEnumerable - 这是有道理的。如果您尝试不这样做,它仍然有效吗?
  • 这意味着您正在从数据库中完全加载提到的表,并在内存中进行任何处理。 VesselBoatAreaY 可能是延迟加载的。
  • @James,不,它没有。看来 AsEnumerable 对其工作至关重要。
猜你喜欢
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多