2009-02-19 59 views
0

我是新來的使用Linq並剛剛開始了一個側面項目來學習一些基礎知識。我目前使用Linq to Sql,並且我所有的數據庫表關係都工作得很好。目前我有一個客戶表和一個項目表。每個客戶可以有一個或多個項目。因此,正如你所期望的,每個Client對象在Linq發揮其魔力之後都有一個Project對象集合。Linq to Sql - 從1中選擇:很多

我使用下面的代碼,它運行良好,但我認爲有一個更好的方法來做到這一點。我需要通過我的方法的專案編號,然後由客戶選擇項目:

private void PopulateStatusView(int projectID) 
    { 
     MyDataContext db = new MyDataContext(); 

     var client = (from u in db.Clients 
         where u.id == Convert.ToInt32(Session["ClientID"]) 
         select u).SingleOrDefault(); 

     if (client != null) 
     { 
      foreach (Project currentProject in client.Projects) 
      { 
       if (currentProject.id == projectID) 
       { 
        // Project Selected Here 
        statusProjectName.Text = currentProject.name; 
       } 
      } 
     } 
     else 
     { 
      // Session Expired 
     } 
    } 

任何人都可以讓我知道如果有一個更好的解決方案,而不是遍歷每個項目。

謝謝。

回答

2

要獲得其中有具體的項目ID的客戶:

var client = (from u in db.Clients 
       where u.id == Convert.ToInt32(Session["ClientID"]) && 
        u.Projects.Any(x=>x.id == projectID) 
       select u).SingleOrDefault(); 

拿到項目:

var project = (from u in db.Clients 
       where u.id == Convert.ToInt32(Session["ClientID"]) && 
        u.Projects.Any(x=>x.id == projectID) 
       select u.Projects.Where(x=>x.id == projectID).Single()).SingleOrDefault(); 
+0

謝謝,這是最簡潔的。在使用Projects.Any和Projects.Where之間有很大的區別嗎? – Sean 2009-02-19 17:54:46

+0

任何返回一個*布爾值*值來指示是否存在這樣的項目ID。哪裏返回那些滿足該ID的項目。 「Any(x)」在語義上類似於「Where(x).Count()> 0」 – 2009-02-19 18:19:04

1

嘗試是這樣的:

clients.Projects.Where(
    p => p.id == projectID 
    && p.name == statusProjectName.Text); 
1

,可隨時更換foreach用類似的東西查找:

var project = client.Projects.Where(p=>p.id==projectID).SingleOrDefault(); 
if (project != null) statusProjectName.Text = project.name;