与IQueryable方法相关的问题(不能隐式地将类型'long?'转换为'long'

时间:2013-09-04 09:48:34

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

我有一个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 是一个长类型,在 vmTest 中有一个 public long field1 m.xxx 有错误说无法隐式转换类型'long?' 'long'。存在明确的转换(你是否错过演员表?)。我可能知道什么是错的吗?

其他信息:
如果我在 m.xxx 前面强加(长),则错误将消失,但当此查询未返回任何值时会出现另一个问题,因为强制转换 null

2 个答案:

答案 0 :(得分: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*/ };
}

答案 1 :(得分:2)

您有几种解决方案:

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

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

有关Nullables here

的更多信息