在LINQ效率中选择语句

时间:2017-05-03 14:52:30

标签: c# linq select

对于下面显示的代码,我想知道是否有更有效的方法在select语句中分配Status和Types?合同与状态/类型之间没有关系,因为合同项来自API调用,而状态/类型来自本地数据库。

有问题的部分是

Status = statuses.FirstOrDefault(y => y.StatusId == x.StatusId)
Type = types.FirstOrDefault(y => y.TypeId == x.TypeId)

有更好的方法来分配这些吗?

var statuses = this.StatusRepository.GetActiveStatuses().ToList();
var types = this.TypeRepository.GetActiveTypes().ToList();
var contracts = this.ContractApi.GetCurrentContracts().Select(x => new ContractItem {
        Id = x.Id,
        Name = x.Name,
        Status = statuses.FirstOrDefault(y => y.StatusId == x.StatusId) ?? Status.Empty(),
        Type = types.FirstOrDefault(y => y.TypeId == x.TypeId) ?? Type.Empty()
    });

2 个答案:

答案 0 :(得分:2)

为了获得更好的性能,您应该使用字典或查找:

var statuses = this.StatusRepository.GetActiveStatuses().ToLookup(x => x.StatusId);
var types = this.TypeRepository.GetActiveTypes().ToLookup(x => x.TypeId);
var emptyStatus = Status.Empty();
var emptyType = Type.Empty();

var contracts = this.ContractApi.GetCurrentContracts()
    .Select(x => new ContractItem {
        Id = x.Id,
        Name = x.Name,
        Status = statuses[x.StatusId].DefaultIfEmpty(emptyStatus).First(),
        Type = types[x.TypeId].DefaultIfEmpty(emptyType).First()
    });

查找更具可读性,因为它可以使用DefaultIfEmpty

答案 1 :(得分:1)

如果您知道它们将存在于您的本地数据库中,您可以将它们存储在类似的字典中;

var statusDict = this.StatusRepository.GetActiveStatuses().ToDictionary(s => s.StatusId);

....

Status = statusDict[x.StatusId]