如果不使用.FirstOrDefault(),我就看不到匿名类型值?

时间:2016-06-21 02:38:07

标签: c# linq

我使用以下返回匿名类型的LINQ查询。如果我不使用.FirstOrDefault()

,我无法在调试中看到值

为什么?我的结果集需要是多行,我还希望在调试时看到结果。如果在调试中不使用.FirstOrDefault(),则表明某些表达式不是实数值(如下图所示)。如果我想获得多行并且想要在调试时看到值,请帮助我该做什么。

enter image description here

 var results5 = (from acc in context.AccountSet
                        join contact in context.ContactSet
                            on acc.PrimaryContactId.Id equals contact.Id
                        select new
                        {
                            _contactId = contact.Id,
                            _accountId = acc.Id
                        }
                            ).FirstOrDefault();

2 个答案:

答案 0 :(得分:3)

Linq查询被懒惰地评估。 (大多数)Linq查询方法返回Iterator。迭代器仅在使用ToListforeachToArray等进行迭代时执行。

在你的情况下,第一个返回一个尚未实现的迭代器,但在第二种情况下你调用了FirstOrDefault,它通过迭代器并返回序列中的First(或Default)元素,这就是你看到结果的原因。

答案 1 :(得分:1)

使用.FirstOrDefault()收集序列的第一个元素,如果序列不包含元素,则收集默认值。该集合中的类型相同(让它成为userAccounts的集合)。如果结果包含N条记录,请使用.ToList()将其转换为列表。哪个会给你List<T>,其中T是集合中的对象类型(例如List<userAccounts>)。

var results5 = (from acc in context.AccountSet
                        join contact in context.ContactSet
                            on acc.PrimaryContactId.Id equals contact.Id
                        select new
                        {
                            _contactId = contact.Id,
                            _accountId = acc.Id
                        }
                            ).ToList();

然后它将像List一样可见;

关于附加图片:

要在不使用.ToList()的情况下查看集合中的元素,请展开+右侧将显示results View和与其关联的刷新图标,单击它。然后它将变得可扩展。它会显示当前结果中的项目。