我使用以下返回匿名类型的LINQ查询。如果我不使用.FirstOrDefault()
为什么?我的结果集需要是多行,我还希望在调试时看到结果。如果在调试中不使用.FirstOrDefault(),则表明某些表达式不是实数值(如下图所示)。如果我想获得多行并且想要在调试时看到值,请帮助我该做什么。
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();
答案 0 :(得分:3)
Linq
查询被懒惰地评估。 (大多数)Linq
查询方法返回Iterator
。迭代器仅在使用ToList
,foreach
,ToArray
等进行迭代时执行。
在你的情况下,第一个返回一个尚未实现的迭代器,但在第二种情况下你调用了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
和与其关联的刷新图标,单击它。然后它将变得可扩展。它会显示当前结果中的项目。