2016-03-21 53 views
1

我想先從特定搜索域ID表基於租戶,然後爲域ID,我在另一個表中尋找域名並添加到列表中。我在列表中添加域對象時出錯。是如下所示我的代碼:'System.Collections.Generic.List <XXX.Models.Domain> .Add(XXX.Models.Domain)'的最佳重載方法匹配有一些無效參數

public IEnumerable<Domain> GetAllByTenant(Guid tenantId) 
    { 
     List<Domain> domains = null; 
     var ids = _applicationDbContext.TenantDomainMap.Where(x => x.TenantId == tenantId).Select(x => x.DomainId); 

     foreach (var id in ids) 
     { 
      var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id); 
      domains.Add(domain); 

     } 
     return domains; 
    } 

我得到下面的錯誤在domains.Add(域): 1.關於「System.Collections.Generic.List.Add(XXX.Models最好重載方法匹配.Domain)「有一些無效參數 2.無法從'System.Linq.IQueryable'轉換爲'XXX.Models.Domain'

請幫我解決這個問題。

回答

2

Where方法始終返回IQueryable,因爲它無法知道有多少項目符合您的謂詞。

Where調用後可以添加4種潛在方法來解決此問題。

單個: 此方法只需要一個匹配,如果找到多個匹配項或者找不到匹配項,它將拋出異常。

var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).Single(); 

的SingleOrDefault: 這種方法是一樣的,除了它會返回默認值(T),其中T是你的類型,當沒有結果被發現的結果Single;這通常是空的。

var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).SingleOrDefault(); 

首先: 此方法將返回列表中的第一個項目,將只拋出一個異常,如果沒有發現匹配。

FirstOrDefault: 這種方法不像First不會在沒有匹配的拋出異常,而不是它的工作原理就像SingleOrDefault並將返回類型的默認值。

var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).FirstOrDefault(); 

假設你正在做的一個ID的搜索,Single可能是正確的選擇,儘管這取決於你的儲蓄邏輯SingleOrDefault可能需要。

+0

謝謝你的詳細解釋。我現在明白了。感謝你的幫助。 – Rash

+0

@Rash不要忘記接受這個答案。 –

+0

@衝擊很高興有幫助。 – Phaeze

1

嘗試添加一個.FirstOrDefault();以確保只返回從Where返回的第一個匹配項。

foreach (var id in ids) 
{ 
     var domain = _applicationDbContext.Domain.Where(x => x.DomainId == id).FirstOrDefault(); 
     domains.Add(domain); 
} 

Where返回類型爲IEnumerable,你需要一個Domain類型添加到您的列表,每個。

+0

非常感謝!!它的工作:) – Rash

相關問題