在我的控制器中,我正在数据库中搜索关联表中的特定记录。
public ActionResult MyAction(int picId, int myOtherId)
{
var itemToEdit =
db.AssocationTable.Single(
x => x.PropertyId == picId && x.MyForeignKey == myOtherId);
var myRecord = db.TestTableOne.Find(itemToEdit.PropertyId);
var lstOfIntsINeed =
db.AssocationTable.Where(
x => x.PropertyId == picId && x.MyForeignKey != myOtherId)
.Select(x => x.MyForeignKey.Value)
.ToList();
// the list above, if nothing is found, will give me an empty list where Count == 0
}
现在我正在做相同的确切代码,但对于不同的属性,我正在接收:
强制转换为值类型"System.Int32"失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可为 null 的类型。
这是我的代码:
public ActionResult MyOtherAction(int picId, int myOtherId)
{
var itemToEdit =
db.AssociationTable.Single(
x => x.PropertyId == picId && x.MyOtherForeignKey == myOtherId);
var myMainRecord = db.TestTableOne.Find(itemToEdit.PropertyId);
var lstOfIntsINeed =
db.AssociationTable.Where(
x => x.PropertyId == picId && x.MyOtherForeignKey != myOtherId)
.Select(x => x.MyOtherForeignKey.Value)
.ToList();
}
在我的数据库和关联表的域模型类中,MyForeignKey
和MyOtherForeignKey
都可以为空:
[ForeignKey("TestTableTwo")]
public int? MyForeignKey { get; set; }
[ForeignKey("TestTableThree")]
public int? MyOtherForeignKey { get; set; }
那么,我的问题..为什么在第一个操作结果中,lst收到计数为0(这是我所期望的),而第二个操作结果收到异常错误?
我认为问题是您在没有先检查null
的情况下在nullable int
上调用.Value
。 最终,这意味着您在查询中间执行缩小隐式转换。
如果要在 .NET 中运行代码,并且x.MyOtherForeignKey
为 null,则会引发Nullable object must have a value
异常。 在本例中,代码将转换为 Linq-to-Sql 表达式并在 EntityFramework 中运行。 我认为它是在您的第二个查询中找到一个空x.MyOtherForeignKey
并给出此异常。
根据您希望代码在遇到null
时执行的操作,您可以更改它以过滤掉nulls
:
var lstOfIntsINeed =
db.AssociationTable.Where(
x => x.PropertyId == picId && x.MyOtherForeignKey != myOtherId && x.MyOtherForeignKey != null)
.Select(x => x.MyOtherForeignKey.Value)
.ToList();
。或将 null 替换为默认值。
我认为您的第一个查询中也存在同样的问题,它在您的测试中没有失败的唯一原因是因为查询不返回任何条目(或者更具体地说,没有带有null
MyForeignKey
的条目),所以它没有失败。
鉴于您已将MyForeignKey
定义为可为 null,则必须考虑它为 null 的情况,因此在该查询中修复它也是明智的。
您可以通过更改.Where()
子句以故意返回具有 null 值的 AssociationTable 条目来测试是否是这种情况。
希望这有帮助