C# 选择Linq不调用方法
我有这个密码Linq c# 雇主限制对注册有限制,但从不调用RestrictionDto的构造函数,只返回null。我在restrictionDto中设置了一个断点,代码永远不会停止 我以前从未见过这个问题。我在代码中有很多这样的代码,工作很好C# 选择Linq不调用方法,c#,linq,C#,Linq,我有这个密码Linq c# 雇主限制对注册有限制,但从不调用RestrictionDto的构造函数,只返回null。我在restrictionDto中设置了一个断点,代码永远不会停止 我以前从未见过这个问题。我在代码中有很多这样的代码,工作很好 有人可以帮忙吗?Linq查询是懒惰的,也就是说,除非有人告诉他们,否则它们实际上不会执行任何操作 换句话说,您没有要求执行查询。如果要执行查询,必须使用ToList或任何您认为适合手头任务的急切操作来完成查询。您必须知道有两种LINQ语句: 返回IEn
有人可以帮忙吗?Linq查询是懒惰的,也就是说,除非有人告诉他们,否则它们实际上不会执行任何操作
换句话说,您没有要求执行查询。如果要执行查询,必须使用
ToList
或任何您认为适合手头任务的急切操作来完成查询。您必须知道有两种LINQ语句:
- 返回
(或IQueryable)的值IEnumerable
- 而那些没有
IEnumerable
的LINQ函数是实际开始枚举的函数:ToList
,ToDictionary
,FirstOrDefault
,Count
,Max
,Any
这些函数使用输入IEnumerable
调用GetEnumerator()
并重复调用MoveNext()
,直到知道返回值。通常需要列举完整的序列,有时只列举其中的几个
例如:
public static bool Any<TSource>(this IEnumerable<Tsource> source)
{
if (source == null) throw new ArgumentNullException(...);
IEnumerator<TSource> enumrator = source.GetEnumerator();
bool containsAnyElement = enumerator.MoveNext();
// no need to check the rest of the sequence, I already know the result:
return containsAnyElement;
}
他们都将在内部执行类似于以下的操作:
var enumerator = restrictions.GetEnumerator();
while(enumerator.MoveNext())
{ // there are still restrictions left
RestrictionDto restriction = enumerator.Current;
// do something with this restriction
}
您是否在创建查询之后的某个地方使用该查询?Linq查询在使用之前不会进行评估。是的,雇主。限制有元素。是,RestrictionD的构造函数接受正确的参数。是的,如果有任何结果,我会向“ToList”查询。这不是问题所在。问题是您在哪里使用查询结果。我知道它有元素,但您在创建查询后是否实际引用了查询?例如,通过迭代结果集,或者调用
.ToList()
?除非你这样做,否则它不会被评估。可能是,而且是专门为。也许我不清楚。结果是一个Linq结果,但当我尝试调用toList时,结果为Null,并且从不调用constructor@PauloToList
将永远不会返回null。此外,如果从未调用构造函数,则表示Employer.Restrictions
为空。也许您应该首先检查源是否为空?如果不是,而且你肯定要打电话给ToList
,我看不出有什么理由它不起作用。。。
IEnumerable<RestrictionDto> restrictions = Employer.Restrictions
.Select(restriction => new RescrictionDto(restriction));
var list = restrictions.ToList();
bool restrictionsAvailable = restrictions.Any();
var firstRestriction = restrictions.FirsOrDefault();
int numberOfRestrictions = restrictions.Count();
foreach (var restiction in restrictions)
{
...
}
var enumerator = restrictions.GetEnumerator();
while(enumerator.MoveNext())
{ // there are still restrictions left
RestrictionDto restriction = enumerator.Current;
// do something with this restriction
}