小编dun*_*ood的帖子

为什么LINQ FirstOrDefault或First生成的调用数

我注意到我们的应用程序出现了一些性能问题,并将其跟踪到我们类中对ID属性的大量调用.

我已经设置了一个样本来解释.

我们有两个类,Person和Address.

我创建了10个实例,每个实例都有ID字段(Person_Id,Address_Id).

在此示例的情况下,Person_Id为1映射到Address_Id为1.

为了将这些链接在一起,我在Person的'Address'中有一个只读属性,它通过对地址集合执行LINQ查询来返回相关的地址对象. 为简单起见,我将返回Address_Id = Person_Id的地址,因为我在每个列表中有相同的项目数,这是用于测试的.

public Address Address
{
    get
    {
        return Addresses.FirstOrDefault(a => a.Address_Id == Person_Id);
    }
}
Run Code Online (Sandbox Code Playgroud)

Person_Id是具有私有支持字段的公共属性.非常简单.

private int _person_Id;
public int Person_Id 
{
    get
    {
        return _person_Id;
    }
    set
    {
        _person_Id = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

当跟踪调用Person_Id内部的次数时,该数量总是高于人员记录的数量.在这种情况下,我正在迭代人员记录列表并输出人员的姓名和状态.

foreach (var person in persons)
{
   var name = person.Name;
   var state = person.Address.State;
   Console.WriteLine(name + "\t" + state);
}
Run Code Online (Sandbox Code Playgroud)

以下是基于迭代的人员实体数量的呼叫数量如何分解:

基于记录数的呼叫

回顾数学,我们可以看到,添加地址#调用一个当前的实体,我们都在和上面增加了总呼吁PERSON_ID.例如:如果我们迭代了5个人的记录,则有5个人调用get的'Address'属性,15个调用get的'Person_Id'属性.15是(5 + 4 + 3 + 2 + 1),调用'地址'的总和.

我很好奇这些数字来自哪里.它是同FirstOrDefault查找 …

.net c# linq

3
推荐指数
1
解决办法
173
查看次数

标签 统计

.net ×1

c# ×1

linq ×1