2012-08-06 31 views
0

我正在使用LINQ to SQL從一組數據庫表中獲取數據。數據庫設計是這樣的,即從一個表(表A)給出一個唯一的ID,並且應該從關聯的表(表B)返回一個並且只有一個實例。從LINQ查詢中選擇一個唯一實例

有撰寫此查詢,並確保只有一個項目是不使用.Count()擴展方法,像下面回到一個更簡潔的方式:

var set = from itemFromA in this.dataContext.TableA 
      where itemFromA.ID == inputID 
      select itemFromA.ItemFromB; 

if (set.Count() != 1) 
{ 
    // Exception! 
} 

// Have to get individual instance using FirstOrDefault or Take(1) 

FirstOrDefault會有一些幫助,但我想,以確保返回的set只包含一個實例而不是更多。

回答

2

這聽起來像你想Single

var set = from itemFromA in this.dataContext.TableA 
      where itemFromA.ID == inputID 
      select itemFromA.ItemFromB; 

var onlyValue = set.Single(); 

文檔狀態:

返回序列的唯一元素,如果有序列中的一個元素是不是拋出異常。

當然,這意味着你沒有得到自定義異常的消息......如果你需要做那種事,我會使用類似:

// Make sure that even if something is hideously wrong, we only transfer data 
// for two elements... 
var list = set.Take(2).ToList(); 
if (list.Count != 1) 
{ 
    // Throw an exception 
} 
var item = list[0]; 

這樣做的好處在當前的代碼中,它會避免多次評估查詢。