2009-12-30 115 views
0

好吧,首先,我是LINQ2SQL的全新人物,所以請原諒我的無知。LINQ to SQL - 按條件限制關係(一對多)(1 - M)

我做了一些搜索,但1小時後,我決定來這裏。

這裏是:

我想要做一些我認爲很簡單的事情。這可能只是我不明白。我正在使用LINQ 2 SQL,通過VS設計器。我有2個表格:客戶和類別。客戶可以有多個類別。

我有一個非常簡單的查詢,尋找客戶:

Client c = db.Clients.SingleOrDefault(client => client.ID == id); 

我想要做的就是修改這使得集合:c.Categories,將只包含該客戶端的類別的子集。

這是我已經試過:

Client c = db.Categories.Where(cat => cat.IsActive == true).Select(cat.Clients).SingleOrDefault(client => client.ID == id); 

我得到一個錯誤報告被返回了多個客戶端。

  1. 我錯過了什麼嗎?這不是LINQ旨在做的事嗎?
  2. 我是否應該使用第一個查詢,然後在我需要該列表時在類別上專門做另一個查詢?

    c.Categories.Categories.Where(貓=> cat.IsActive ==真)

預先感謝您。

+0

你怎麼想限制類別清單的客戶端?是否有您希望查看的分類表上的「IsActive(bool)」字段? – 2009-12-30 22:19:17

+0

這正是我想要做的。 – Kevin 2009-12-30 22:50:03

回答

1

SingleOrDefault()適用於只有一個結果的情況。似乎有多個記錄具有該ID。嘗試使用FirstOrDefault()代替。

Client c = db.Categories.Where(cat => cat.Name == "Name").Select(cat.Clients).FirstOrDefault(client => client.ID == id); 
+0

它編譯並運行,但條件(cat.Name ==「Name」)完全被忽略。 – Kevin 2009-12-30 22:16:15

+0

好的,看着你的代碼,我實際上對你想要完成的事情感到困惑。你究竟想要做什麼?你是否想從數據庫中刪除記錄? – BFree 2009-12-30 22:36:29

+0

我剛剛複製了Marc的評論: 您想如何限制客戶端的類別列表?是否有您希望查看的分類表上的「IsActive(bool)」字段? - marc_s 30分鐘前 這有意義嗎? – Kevin 2009-12-30 22:50:49

1

的問題是Categories.Where部分與Select組合,將返回集合的集合。您可能需要做的是使用SelectMany或使用Single(或SingleOrDefaultFirstFirstOrDefault)而不是Where

例子:

Client c = db.Categories.Where(cat => cat.IsActive) 
         .SelectMany(cat.Clients) 
         .SingleOrDefault(client => client.ID == id); 

Client c = db.Categories.Single(cat => cat.IsActive) 
         .Clients 
         .SingleOrDefault(client => client.ID == id); 
+0

第二個不會工作。我需要使用該名稱的所有類別... 可能是名稱是一個不好的例子...讓我修改我的原始問題 – Kevin 2009-12-30 22:54:56

+0

您仍然犯了錯誤,您需要SelectMany。 – 2009-12-31 06:17:13