我正在为每个循环
foreach (Account acct in acctTest)
{
if (acct.AccountId == acctId)
{
foreach (Customer cust in acct.CustomerColl)
{
if (cust.CustomerId == custId)
{
customerName = cust.CustomerName;
break;
}
}
}
}
Linq查询做类似的事情(认为这可以改进)
customerName = (from acct in acctTest
where acct.AccountId == acctId
from cust in acct.CustomerColl
where cust.CustomerId == custId
select cust.CustomerName).ToString() ;
我在1000次循环中执行上述两次5次,得到如下的执行时序。
每个人的经历时间::: 7377
Linq2经历的时间::: 15653
每个人的经历时间::: 1576年
Linq2经历的时间::: 1718
每个人的经历时间::: 1569年
Linq2经过的时间::: 1726
每个人的经历时间::: 1569年
Linq2经历的时间::: 5583
每个人的经历时间::: 1570年
Linq2经历的时间::: 1506
为什么执行时间存在差异和不一致? 另外,有没有一种方法可以重写LINQ查询以获得更好的性能?
答案 0 :(得分:2)
(from acct in acctTest
where acct.AccountId == acctID
select acct.CustomerColl)
.Where(c => c.CustomerId == custId)
.Select(cn => cn.CustomerName)
.FirstOrDefault()
答案 1 :(得分:1)
第四次执行看起来像Linq方面的垃圾收集。
除此之外,LINQ不知道您只是尝试获取客户名称的单个实例。它不知道CustomId或AccountId是唯一的关系,这是您的代码所假设的。简而言之,代码不是类似的:)
此外,在第一个示例中,您可能需要检查外部循环,如果custerName!= NULL,那么您可以停止短路;)
答案 2 :(得分:1)
显而易见的是,查看上面的代码是 - 如果是foreach
,则在为customerID找到 a 匹配时停止内循环执行。
然而,LINQ似乎并非如此。
foreach
和LINQ查询的输出是否相同?
如有人在这里建议的那样使用JOIN并使用FirstOrDefault
怎么样?
答案 3 :(得分:0)
您是否已将LINQ的使用标识为应用程序中的瓶颈?如果没有,你不太可能在传统的foreach和lambdas之间追逐微秒正在燃烧你的宝贵时间而没有真正的好处。与在所有LINQ表达式组合中相比,您可能会花费更多时间在一个数据库调用或I / O操作上。相反,担心这些。