Null的奇数LINQ行为

时间:2014-05-19 22:16:51

标签: asp.net-mvc c#-4.0 linq-to-entities

我试图在LINQ语句中处理null属性,如下所示:

var items = db.Words.Select(w => new WordViewModel
{
    WordId = w.WordId,
    MasterId = w.MasterId,
    MasterWord = ((w.WordMaster == null) ? "is null" : "not null?!?"),
    LanguageName = ((w.Language == null) ? "" : w.Language.LanguageName),
    CategoryName = ((w.Category == null) ? "" : w.Category.CategoryName)
});

这似乎适用于LanguageName和CategoryName变量。不幸的是,MasterWord变量收到" not null?!?"即使w.WordMaster属性为null。为了确保WordMaster属性确实为null,我运行了for循环,它成功地显示了值" IsNull"当我在调试器中检查时。

foreach(var word in db.Words)
{
    var str = ((word.WordMaster == null) ? "IsNull" : "NotNull");
}

我在这里找不到任何愚蠢的东西吗?

- 编辑 -

我想我已经找到了WordMaster和Category属性之间的主要区别。我使用的是Entity Framework,因此两个tie都是由相应的外键MasterId和CatId自动生成的。在数据库和生成的模型中,MasterId是NOT NULL int,而CatId是可空的。 MasterId仍然有一些带有默认ID但没有指向真实Word的条目 - 这些条目在检查器中显示为可空(查看db.Words),但显然不在LINQ查询中。而CatId实际上是null,而其Category属性正确显示为null。

1 个答案:

答案 0 :(得分:0)

我找到了解决办法,我认为可以为问题提供更好的背景。幸运的是,所有不正确的MasterId都有默认值1,我只需检查(word.MasterId == 1)而不是检查(word.WordMaster == null)。这是新代码:

var items = db.Words.Select(w => new WordViewModel
{
    WordId = w.WordId,
    MasterId = w.MasterId,
    MasterWord = ((w.MasterId == 1) ? "is null" : w.WordMaster.WordName),
    LanguageName = ((w.Language == null) ? "" : w.Language.LanguageName),
    CategoryName = ((w.Category == null) ? "" : w.Category.CategoryName)
});

我还在Word表中伪造了MasterId == 1,因此w.WordMaster.WordName可以运行而不会抛出错误。

这可以作为临时解决方案。我将尝试使MasterId可以为空,看看是否可以修复它,但这是一个大项目所以这可能需要一段时间。