【问题标题】:"Cannot implicitly convert type 'bool[]' to 'object[]'"“不能将类型 'bool[]' 隐式转换为 'object[]'”
【发布时间】:2014-04-25 12:46:46
【问题描述】:

我有一个 LINQ 查询来从我的数据库中获取数据:

query.Select(b => b.BooleanValue.Value).Distinct().ToArray(); 

这个查询给了我错误

Linq 无法将类型“bool[]”隐式转换为“object[]”。

我在十进制值上得到同样的错误,但在文本值上一切正常。我在整个互联网上进行了搜索,只找到了对objectbool 有问题的人。

你知道如何(在 LINQ 中 select)将 decimal 转换为 object 吗?

【问题讨论】:

  • 您使用什么 linq 提供程序?
  • 不应该有b => b.BooleanValue.GetValueOrDefault()吗?或者你确定每个布尔值都会有一个值?
  • 不,它是一个可为空的布尔值
  • 采用不同的布尔值有什么意义?由于您使用的是ValueNullable<bool>,因此您知道这些值是非空的。因此,您将获得一个最多包含两个元素的数组(当query 为空时,您将获得零个元素,当所有布尔值相同时获得一个元素,当truefalse 都存在时获得两个元素)。您是否尝试检查与布尔标志混合相关的一些特殊条件(例如“一些标志是true”或“所有标志都相同”?)
  • @jfamvg:当b.BooleanValue = null 出现时,.Select() 会出现异常,因为.Value 将不存在。

标签: c# linq


【解决方案1】:

您有一个 LINQ-to-Entities 查询,您希望在服务器上执行该查询并将结果作为对象数组返回。服务器上的查询给出了一系列不同值类型的值。

所以我们要做的就是在服务器上执行尽可能多的查询,然后在客户端将结果转换为普通序列,然后在客户端将值装箱。所以:

object[] results = query
  .Select(b => b.BooleanValue.Value) // on the server
  .Distinct() // on the server
  .AsEnumerable() // now we're on the client
  .Cast<object>() // box each value to object on the client
  .ToArray(); // put the results into an array of objects on the client

完成。

【讨论】:

  • 谢谢!这是一个解决方案!
  • @jfamvg:不客气。当您的问题得到解答后,请在您认为最佳的答案旁边打勾,以便人们知道您有解决方案。
【解决方案2】:
query
  .Select(b => b.BooleanValue.Value)
  .Distinct()
  .Cast<object>()
  .ToArray();

你可能需要这样做:

query
  .Select(b => b.BooleanValue.Value)
  .Distinct()
  // execute query
  .AsEnumerable()
  // cast in memory
  .Cast<object>()
  .ToArray();

仅限arrays of reference types are co-variant。这是controversial 功能。

【讨论】:

  • 或者甚至只是 ToArray&lt;object&gt;() 而不是 Cast 调用。
  • @Rawling - ToArray&lt;object&gt; 不需要 IEnumerable&lt;object&gt; 作为输入吗?
  • 我添加了 .Cast() 但出现错误:无法将类型“System.Decimal”转换为类型“System.Object”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。
  • 为了澄清您的最后一点,有争议的一点是该功能根本存在,而不是仅针对引用类型存在。 (事实上​​,值类型数组存在一些协方差;CLR 将允许int[]uint[] 的转换成功。)
  • 使用AsEnumerable,而不是ToArray,将服务器上的查询带入客户端。
【解决方案3】:
query.Select(b => (object)b.BooleanValue.Value).Distinct().ToArray();

query.Select(b => b.BooleanValue.Value).Distinct().Cast<object>().ToArray();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多