2011-04-12 60 views
0

我有這4個表: enter image description here幫助意想不到的LINQ查詢結果

這個查詢

var query = db.Authors 
        .Where(x=> x.ItemAuthors 
         .Any(z=> z.Item.CategoryItems 
          .Any(b=> b.categoryID == 10))) 
        .Select(ci=> new 
       { 
        authorText = string.Format("{0} ({1})", ci.text, 
                 ci.ItemAuthors.Count()), 
        authorId = ci.authorID 
       }); 

其中填充的著者下拉列表預期其中工程。問題是,當我嘗試計算分配給每個作者的項目數時,它計數爲,作者在整個項目表中每有項。

因此,例如,如果作者總共有10本書,但在上述查詢中只有2本書出現,我仍然可以獲得10本書的計數。當我將相同的查詢綁定到控件時,我找回正確的數據,這只是計數操作無法正常工作。

重申我將它綁定到一個gridview,我只看到每個作者一本書,而不是作者寫的所有書。所以看起來我的查詢應該是正確的。

更新: @Jon Skeet,我無法使用let運營商,因爲我有條件地構建我的查詢。我通過使用原始查詢獲取計數來解決我的問題。以下是我修改了原來的Count()語法:

var query = authors2.Select(x => new 
      { 

       authorText = string.Format("{0} ({1})",x.text, x.ItemAuthors 
         .Where(qq=> qq.Item.CategoryItems 
          .Any(xt=> xt.categoryID == 10)) 
          .Count()), 
       authorId = x.authorID 

      }); 
+0

你沒有顯示你想要做計數的代碼...請顯示*不工作的代碼。 – 2011-04-12 06:38:43

+0

這是在我選擇的新語句中,通過'authorText'你必須滾動。 – 2011-04-12 06:39:30

+0

哎呀 - 我沒有看到它,因爲滾動。這是值得的格式,以便我們不必這樣做......現在回答。 – 2011-04-12 06:41:03

回答

1

您使用i.Author.ItemAuthors.Count()其徑直回滿了桌子。我懷疑你可能想是這樣的:

var query = from ia in db.ItemAuthors 
      let count = ia.CategoryItems.Count(t => t.categoryID == 10)) 
      where count > 0 
      select new 
      { 
       authorText = string.Format("{0} ({1})", i.Author.text, count), 
       authorId = i.Author.authorID 
      }; 

在另一方面,我希望這給一個結果每ItemAuthor這是不是真的,你想要什麼。如果你想的作者列表,我期望的查詢作者表開始:

var query = from author in db.ItemAuthors 
      let count = author.Items 
           .Count(ia => ia.Item.CategoryItems 
                .Any(ci => ci.CategoryID == 10)) 
      select new 
      { 
       authorText = string.Format("{0} ({1})", author.text, count), 
       authorId = author.authorID 
      }; 

換句話說,每個作者,找出多少個項有至少一個類別ID爲10 ...然後報告許多項目。由於各種一對多關係(每本書可能有多個作者多個類別),它有點複雜。

+0

這是說'author.Items'沒有包含count的定義。 – 2011-04-12 06:57:06

+0

@Nick:'author.Items'的類型是什麼? – 2011-04-12 06:58:43

+0

我相信它應該是項目表類。我在我的問題中更新了我的代碼以反映作者表。 – 2011-04-12 07:02:55