[英]DefaultIfEmpty() + select new MyStronglyTypeObj()
我的目标是通过linq
left join
返回结果。 io.IsDefault
可以为null
但要MyStronglyTypeObj
此数据,我想将MyStronglyTypeObj
obj与其余数据一起返回。
context.Image.Where(i => i.IsActive == true)
有3行。 其中之一具有isDefault null
因为此ImageId
(io => io.ImageId == i.ImageId)
ImageObject
存在于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()
函数
请帮忙
DefaultIfEmpty()
仅影响空集合,并使该集合返回具有值default(T)
的单个元素(其中T
==集合类型)。
例如,使用字符串(注意default(string)
== null
):
因此,根据您提供的代码:
DefaultIfEmpty()
不是一个因素 select
语句,这实际上没有任何意义 我猜i
是MyStronglyTypeObj
类型(基于属性匹配)吗? 我怀疑在运行此代码时还有另一个因素没有考虑在内。
尝试在该行上放置一个断点,然后在调试器中查看结果。
另外,由于LINQ使用延迟执行,因此该查询代码直到消耗掉才真正“运行”,并且取决于发生的时间,源数据可以更改(本质上,如果更改源数据,很容易导致计时错误。别的地方)。 更令人沮丧的是,当您使用调试器并查看其中的结果时,这可能会导致该错误消失,因为这会导致代码更快地执行。 您可以通过.ToList()
的末尾添加.ToList()
来使结果立即执行来避免这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.