2010-08-14 104 views
2

任何人都可以告訴我如何在Entity Framework 4.0中編寫以下查詢嗎? 「博客」和「類別」是我的實體。查詢基本上返回了類別列表和該類別中的博客數量。Entity Framework 4 INNER JOIN幫助

SELECT b.CategoryId, c.Value, Count(b.Id) AS [Count] FROM dbo.Blogs b 
INNER JOIN dbo.Categories c ON b.CategoryId = c.Id 
GROUP BY b.CategoryId, c.Value 

在此先感謝。

回答

3

以下應該工作(LinqToEntities):

var categories = from c in oc.Categories 
       select new 
       { 
        CategoryId = c.Id, 
        c.Value, 
        Count = c.Blogs.Count() 
       } 

這會給你的類別ID的列表和值的對於每個類別ID,您可以獲得該類別中的博客數量。

編輯:給你的評論中的問題給出一個答案:這是不可能在LinqToEntities中,但你可以在實體SQL中做到這一點。

var results = new ObjectQuery<DbDataRecord>(
    @"SELECT y, COUNT(y) 
     FROM MyEntities.Blogs AS b 
     GROUP BY YEAR(b.CreatedDate) AS y", entities).ToList(); 
var nrBlogsPerYear = from r in results 
        select new { Year = r[0], NrBlogs = r[1] }; 

在實體SQL查詢中,應該用您的上下文的名稱替換MyEntities

編輯:正如我剛纔通過克雷格評論發現,在今年is possible在L2E分組,所以你可以寫你的查詢是這樣的:

var nrBlogsPerYear = from b in oc.Blogs 
         group b by b.CreatedDate.Year into g 
         select new { Year = g.Key, NrBlogs = g.Count() }; 
+0

謝謝!它工作完美。我不知道我們可以在沒有定義具有這些屬性的類的情況下「選擇新的」。 – tempid 2010-08-14 19:44:42

+0

如果你不介意的話,還有一個簡單的問題。我如何編寫一個L2E查詢來返回Year和當年的博客數量。 Blog.CreatedDate有最新信息,我尋找類似 年計數 ----------- 2010年第12 2009年45 等。這樣我就可以像UI顯示2010 (12),2009(45)..謝謝! – tempid 2010-08-14 19:56:02

+1

您也可以在L2E中進行年份分組。 [L2E支持Year屬性](http://msdn.microsoft.com/en-us/library/bb738681.aspx) – 2010-08-16 13:55:45

2

如果你在你的實體導航屬性,你可以這樣做:

var cats = from c in db.Categories 
      let count = c.Blogs.Count() 
      where count > 0 
      select new 
      { 
       CategoryId = c.Id, 
       Value = c.Value, 
       Count = count 
      }; 

如果你喜歡使用顯式連接,你可以做這樣的:

var cats = from c in db.Categories 
      join b in db.Blogs on c.Id equals b.CategoryId into g 
      select new 
      { 
       CategoryId = c.Id, 
       Value = c.Value, 
       Count = g.Count() 
      }; 
+0

感謝您的效應初探。 – tempid 2010-08-14 19:46:04

+0

這太好了。但我的情況我不能罰款'b.CategoryId'。如果我使用'b.CategoryID',則顯示該屬性不存在的錯誤。我可以通過提供'b.Category.Id'來避免編譯時間問題。但在這種情況下,結果與Inner Join不等效(http://msdn.microsoft.com/zh-cn/library/bb896266.aspx)。我的問題是http://stackoverflow.com/questions/11506333/foregin-keys-are-not-mapped-in-the-entity-framework-version-4-0 – kbvishnu 2012-07-17 06:10:40

1
var query = from p in B.Products 
      join c in B.Categories on p.CategoryID equals c.CategoryID 
      orderby c.CategoryName,p.ProductName 
      select new 
      { 
       c.CategoryName , 
       p.ProductName, 
       p.ReorderLevel 
      }; 

GridView1.DataSource = query.ToList(); 
GridView1.DataBind();