2017-05-03 46 views
0

對於代碼如下所示,我不知道有沒有分配在SELECT語句中的地位和類型的更有效的方法?還有就是合同和/類型爲合同項目是從API調用和狀態來的狀態沒有關係/類型是從本地數據庫。在LINQ效率選擇語句

有問題的部分是

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

爲了獲得更好的性能,您應該使用字典或查找:

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

+0

這很酷。我從來沒有見過這樣做。謝謝你和@Milney的幫助! –

1

如果你知道他們會在你的本地數據庫中,你可以將它們存儲在一個字典等;

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

.... 

Status = statusDict[x.StatusId] 
+1

要複製OP的原始功能,你應該叫' statusDict.TryGetValue(x.StatusId,out Status)''。 –

+0

那個字典只是存儲StatusIds?因爲select語句中的Status和Type是對象。 –

+1

字典通過其Id作爲密鑰存儲對象。所以,你可以在ID傳遞,並返回你的物體,速度比在整個列表中的每個時間尋找... – Milney