首页 文章

DefaultIfEmpty()选择新的MyStronglyTypeObj()

提问于
浏览
0

我的目标是通过 linq 通过 left join 返回结果 . io.IsDefault 可以是 null 但是我想要将其余数据返回 MyStronglyTypeObj obj .

context.Image.Where(i => i.IsActive == true) 有3行 . 其中一个是默认 null 因为这个 ImageId - (io => io.ImageId == i.ImageId) 剂量存在于 ImageObject

var test2 = (from i in context.Image.Where(i => i.IsActive == true)
             from io in ImageObject.Where(io => io.ImageId == i.ImageId).DefaultIfEmpty()
             select new MyStronglyTypeObj() { Alt = i.Alt, Caption = i.Caption, DisplayName = i.DisplayName, Extension = i.Extension, IsDefault = io.IsDefault, Height = i.Height, Width = i.Width, Name = i.Name });
        // return 2 imgs - the 3rd one without isDefault (isDefault = null) wasn't added to collection.
var test = (from i in context.Image.Where(i => i.IsActive == true)
            from io in ImageObject.Where(io => io.ImageId == i.ImageId).DefaultIfEmpty()
            select i); // return 3 imgs

对我来说,我看不到的东西是显而易见的吗? - 也许我完全误解了 .DefaultIfEmpty() 功能

请帮忙

1 回答

  • 0

    DefaultIfEmpty()仅影响空集合,并使该集合返回值为 default(T) 的单个元素(其中 T ==集合类型) .

    例如,使用字符串(注意 default(string) == null ):

    所以基于你提供的代码:

    • DefaultIfEmpty() 不是一个因素

    • 唯一的另一个区别是 select 语句,它没有多大意义

    我猜 i 是类型 MyStronglyTypeObj (基于属性匹配)?我怀疑's another factor when you'运行此代码,你没有考虑到 .

    尝试在该行上放置断点,并在调试器中查看结果 .

    此外,由于LINQ使用延迟执行,因此此查询代码不会在其他位置更改源数据 . 更令人沮丧的是,当您使用调试器并查看结果时,这可能会导致此错误消失,因为它会导致代码更快地执行 . 您可以通过在行尾添加 .ToList() 来避免这种情况,从而立即执行结果 .

相关问题