DefaultIfEmpty()+选择新的MyStronglyTypeObj()

时间:2018-12-08 22:57:57

标签: c# linq

我的目标是通过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()函数

请帮助

1 个答案:

答案 0 :(得分:0)

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

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

enter image description here

因此,根据您提供的代码:

  • DefaultIfEmpty()不是一个因素
  • 唯一的区别是select语句,这实际上没有任何意义

我猜测iMyStronglyTypeObj类型(基于属性匹配)吗?我怀疑在运行此代码时还有另一个因素没有考虑在内。

尝试在该行上放置一个断点,然后在调试器中查看结果。

此外,由于LINQ使用延迟执行,因此该查询代码直到消耗完后才真正“运行”,并且取决于发生的时间,源数据可以更改(本质上,如果您要更改,很容易造成计时错误。源数据)。更令人沮丧的是,当您使用调试器并查看其中的结果时,这可能会导致该错误消失,因为这会导致代码更快地执行。您可以通过在行的末尾添加.ToList()来使结果立即执行来避免这种情况。