【问题标题】:Issue related to IQueryable method (Cannot implicitly cast type 'long?' to 'long'与 IQueryable 方法相关的问题(不能将类型“long?”隐式转换为“long”
【发布时间】:2013-09-07 18:25:05
【问题描述】:

我有一个 IQueryable 方法如下:

public IQueryable<vmTest> TestMethod(long ID)
{
    return from m in db.table1
           join n in db.table2
           on m.table1_ID equals n.table1_ID into tabC
           from c in tabC
           join o in db.table3
           on m.table3_ID equals o.table3_ID
           where m.table1_ID.Equals(ID)
           select new vmTest{ field1 = m.xxx };
}

从上面的代码中,m.xxx 是一个 long 类型,并且在 vmTest 中有一个 public long field1m.xxx 有错误说 Cannot implicitly convert type 'long?'到“长”。存在显式转换(您是否缺少演员表?)。我可以知道有什么问题吗?

其他信息:
如果我在 m.xxx 前面投射 (long),错误将会消失,但是当这个查询没有返回值时会出现另一个问题,因为投射 long 是错误的null

【问题讨论】:

  • 正如错误所说:一个是long,另一个是long?,即Nullable&lt;long&gt;。从你给出的代码中无法说出哪个是哪个。
  • 你确定这两个都不可以为空吗?
  • 实际上我认为我们可以肯定地说m.xxx 必须是long? 并且vmTest.field1long,因为如果它是相反的方式它会工作(long 是隐式转换为long?)。
  • 在我的 vmTest 类中没有任何字段可以为空
  • 好吧,我的错,我对 MVC 甚至 C# 都太陌生,因此永远不知道有一个 long? 类型,它不同于 long

标签: c# linq asp.net-mvc-4 iqueryable


【解决方案1】:

您有几种解决方案:

  • 您可以更改 vmTest 类定义并将 field1 类型从 long 替换为 long 吗?
  • 您可以更改数据库中的表并将 xxx 从 NULL 转换为 NOT NULL,然后 xxx 将变为 long
  • 您可以在查询中使用条件,例如

    new vmTest { field1 = m.xxx.HasValue ? m.xxx.Value : 0 }
    

更多关于 Nullables 的信息here

【讨论】:

    【解决方案2】:

    如果你确定要使用的类型,你可以试试这个:

    public IQueryable<vmTest> TestMethod(long ID)
    {
        return from m in db.table1
               join n in db.table2
               on m.table1_ID equals n.table1_ID into tabC
               from c in tabC
               join o in db.table3
               on m.table3_ID equals o.table3_ID
               where m.table1_ID.Equals(ID)
               select new vmTest
                   { 
                        field1 = m.xxx.HasValue 
                            ? m.xxx.Value
                            : default(long) /*or something else, or an exception maybe... according to your expectation in this case*/ };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多