【问题标题】:Null reference exception in linq select statementlinq select语句中的空引用异常
【发布时间】:2020-08-22 07:54:31
【问题描述】:

我从下面的 linq 查询中得到一个空引用异常。我有一个带有 entityID 的表(引用另一个表来获取翻译文本),但在某些情况下,我的子表中没有正确的翻译文本。这种情况下,我需要获取lookupName 字段文本并分配给lookupName 字段。

 await _context.FormLookup.Where(x=>!(x.isDeleted))
                .Select(x => new LookupList() { 
                    lookupID = x.lookupID, 
                    TransilatedName = _context.TranslatedText.FirstOrDefault(z => z.entityID == x.entityID && z.languageId == language && !(z.isDeleted)).languageText, 
                    lookupName = x.lookupName, 
                    itemCount = x.lookupDetails.Count(),
                    parent = x.parentID
                }).ToListAsync();

我需要添加类似的条件

TransilatedName = _context.TranslatedText.FirstOrDefault(z => z.entityID == x.entityID && z.languageId == language && !(z.isDeleted)) != null ? TransilatedName = _context.TranslatedText.FirstOrDefault(z => z.entityID == x.entityID && z.languageId == language && !(z.isDeleted)).languageText : x.lookupName,

有什么建议吗?

【问题讨论】:

    标签: linq linq-to-sql entity-framework-core linq-to-entities


    【解决方案1】:

    在使用FirstOrDefault之前选择属性LanguateText:

    var query = dbContext.FormLookup
        .Where(x=>!(x.isDeleted))
        .Select(x => new LookupList()
        { 
            lookupID = x.lookupID, 
            TransilatedName = dbContext.TranslatedText
                .Where(translatedText => translatedText.entityID == x.entityID
                                      && translatedText.languageId == language 
                                      && !translatedText.isDeleted)
                .Select(translatedText => translatedText.languageText)
                .FirstOrDefault(), 
            ...
        });
    

    【讨论】:

    • 谢谢,但在某些情况下,语言文本可能在 db 中不可用。所以这种情况下我需要将 lookupName 字段值分配给 TransilatedName 字段
    • 叹息。如果你已经给出了你的班级描述,并在你的班级中使用了正确的复数形式,那么下面的内容会更容易描述。您的表 TranslatedTexts(复数)是零行或多行的表。每行包含一个 TranslatedText(单数)。每个 TranslatedText 都有一个属性 LanguageText,它可能为空。可能是在您的 Where 之后没有留下任何行,但仍然:在 Where 之后的每个 TranslatedText 都将有一个属性 LanguageText。同意?因此,从您可能的空序列中,您可以选择此属性。结果:LanguageTexts 序列。
    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2012-09-29
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多