C# 与IQueryable方法相关的问题(无法将类型“long?”隐式转换为“long”

C# 与IQueryable方法相关的问题(无法将类型“long?”隐式转换为“long”,c#,linq,asp.net-mvc-4,iqueryable,C#,Linq,Asp.net Mvc 4,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

我有一个可行的方法,如下所示:

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中有一个公共长字段1。m.xxx有一个错误,它说不能隐式地将类型“long”转换为“long”。存在显式转换。是否缺少转换?我可以知道有什么问题吗

其他信息:
如果我在m.xxx前面强制执行long,则错误将消失,但当此查询不返回任何值时会出现另一个问题,因为将long强制执行null是错误的。如果您确定要使用的类型,可以尝试以下操作:

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*/ };
}

如果确定要使用的类型,可以尝试以下方法:

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*/ };
}

您有几种解决方案:

您可以更改vmTest类定义并将field1类型从long替换为long? 您可以在数据库中更改您的表,并将xxx从NULL转换为NOTNULL,然后xxx将成为一个长字符串 您可以在查询中使用以下条件

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

有关Nullables的更多信息

您有几种解决方案:

您可以更改vmTest类定义并将field1类型从long替换为long? 您可以在数据库中更改您的表,并将xxx从NULL转换为NOTNULL,然后xxx将成为一个长字符串 您可以在查询中使用以下条件

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

关于Nullables的更多信息

正如错误所说:一个是长的,另一个是长的?哪一个是可以为空的。哪一个是你给出的代码不可能说的。你确定这两个都不能为空的吗?实际上我想我们可以肯定地说m.xxx必须为长的?而vmTest.field1是长的,因为如果它是另一种方式在我的vmTest类中,没有任何字段是可以为null的好吧,我对MVC甚至是Cand来说太新了,因此我永远不知道有一个long?类型与long不同,错误是:一个是long,另一个是long?可以为null。哪一个是long?这是不可能说的从你给出的代码来看。你确定这两个字段都不能为空吗?事实上,我想我们可以肯定地说m.xxx必须是长的?而vmTest.field1是长的,因为如果它是另一种方式,那么long可以隐式地转换为long?。在我的vmTest类中,没有任何字段可以为空。好吧,糟糕,我太新了对于MVC,甚至是Cand,我们永远都不知道有一种与long不同的long?类型