Linq查询可能为空,属性不是。

3
我有一个属性是非空的(它是主键)。但我有一个查询在该表中使用LEFT JOIN,可能会创建空值的情况。 LINQ
(from a in dbContext.TableA
join b in dbContext.TableB on a.IdB equals b.IdB into bLeft
from bTbl in bLeft.DefaultIfEmpty()
select new
{
    IdBTemp = bTbl.IdB, // This value may be null
    IdATemp = a.IdA
}.AsEnumerable().Select(row => new DynamicClassModel()
{
    // Stuff here (convertion to string, concatanations and other stuff)
});

类模型
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("IdB")]
public long IdB { get; set; }

这只是一个小查询示例。我的查询比这个更大,还有更多的左连接,也有更多的字段未映射为null,但它们在此查询中可能为空。


我正在阅读关于LET的文章,也尝试使用某些值(如0)填充空值。

如何将null值传递到非null属性?

2个回答

3
你可以尝试使用默认值0来填充它:
(from a in dbContext.TableA
join b in dbContext.TableB on a.IdB equals b.IdB into bLeft
from bTbl in bLeft.DefaultIfEmpty()
select new
{
    IdBTemp = bTbl == null ? 0 : bTbl.IdB,
    IdATemp = a.IdA
}.AsEnumerable().Select(row => new DynamicClassModel()
{
    // Stuff here (convertion to string, concatanations and other stuff)
});

但也许您想使用int?。 如果是这种情况,请使用以下内容:

(from a in dbContext.TableA
join b in dbContext.TableB on a.IdB equals b.IdB into bLeft
from bTbl in bLeft.DefaultIfEmpty()
select new
{
    IdBTemp = bTbl == null ? (int?)null : bTbl.IdB,
    IdATemp = a.IdA
}.AsEnumerable().Select(row => new DynamicClassModel()
{
    // Stuff here (convertion to string, concatanations and other stuff)
});

当我尝试过它时,我没有尝试使用 **(int?)**,现在打算尝试一下。 - Michel Ayres
非常好,像魔法一样=D 谢谢,也感谢在SO中我所得到的最快回复 =P - Michel Ayres

2

尝试将默认值指定为您想要的值:bLeft.DefaultIfEmpty(0) 或者 bLeft.DefaultIfEmpty(-1)


哦,我现在感觉很菜鸟。我不知道可以这样做=X也要去测试一下=) - Michel Ayres
这是一个实体,而不仅仅是一个属性 =( 我需要声明类似于 new TableBClass() 的东西。 - Michel Ayres
1
这完全取决于您希望在没有默认值的情况下设置什么。或者在您选择的匿名类型中将IdBTemp设置为可空。 - Alexey Raga
+1 这个提示很棒。正确的应该是 @p.s.w.g,但非常感谢 =) - Michel Ayres
1
@Michel FYI,你需要使用bLeft.Select(x => x.IdB).DefaultIfEmpty(0) - p.s.w.g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接