我的目标是通过 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 回答
DefaultIfEmpty()仅影响空集合,并使该集合返回值为
default(T)
的单个元素(其中T
==集合类型) .例如,使用字符串(注意
default(string)
==null
):所以基于你提供的代码:
DefaultIfEmpty()
不是一个因素唯一的另一个区别是
select
语句,它没有多大意义我猜
i
是类型MyStronglyTypeObj
(基于属性匹配)?我怀疑's another factor when you'运行此代码,你没有考虑到 .尝试在该行上放置断点,并在调试器中查看结果 .
此外,由于LINQ使用延迟执行,因此此查询代码不会在其他位置更改源数据 . 更令人沮丧的是,当您使用调试器并查看结果时,这可能会导致此错误消失,因为它会导致代码更快地执行 . 您可以通过在行尾添加
.ToList()
来避免这种情况,从而立即执行结果 .