繁体   English   中英

DefaultIfEmpty()+选择新的MyStronglyTypeObj()

[英]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语句,这实际上没有任何意义

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM