我的目标是通过left join
通过linq
返回结果。 io.IsDefault
可以是null
,但为此我想返回MyStronglyTypeObj
obj和其余数据。
context.Image.Where(i => i.IsActive == true)
有3行。其中一个具有isDefault 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()
函数
请帮助
答案 0 :(得分:0)
DefaultIfEmpty()
仅影响空集合,并使该集合返回值为default(T)
(其中T
==集合类型)的单个元素。
例如,使用字符串(注意default(string)
== null
):
因此,根据您提供的代码:
DefaultIfEmpty()
不是一个因素select
语句,这实际上没有任何意义我猜测i
是MyStronglyTypeObj
类型(基于属性匹配)吗?我怀疑在运行此代码时还有另一个因素没有考虑在内。
尝试在该行上放置一个断点,然后在调试器中查看结果。
此外,由于LINQ使用延迟执行,因此该查询代码直到消耗完后才真正“运行”,并且取决于发生的时间,源数据可以更改(本质上,如果您要更改,很容易造成计时错误。源数据)。更令人沮丧的是,当您使用调试器并查看其中的结果时,这可能会导致该错误消失,因为这会导致代码更快地执行。您可以通过在行的末尾添加.ToList()
来使结果立即执行来避免这种情况。