2012-05-21 44 views
0

我創建了三個表 - Podcast,Category和CategoryLink。 CategoryLink表只包含兩列--PodcastId和CategoryId。 我已經描述了這些表之間的多對多關係,寫在這個article。 所有工作正常,但我不知道如何正確查詢。 現在我做到這一點通過以下方式:使用多對多關係進行查詢的正確方法

var ps = db.Podcasts.Where(p => p.Status.SysStatus > 0); 
if (category_id.HasValue) 
    ps = ps.Where(p => p.Categories.Where(c => c.Id == category_id.Value).FirstOrDefault() != null); 

它的工作原理,但我認爲這是一個有點髒的方式:-)

它給我下面的SQL查詢(我已經去除了多餘的列字符串):

SELECT 
[Project2].[Id] AS [Id] 
FROM (SELECT 
    [Extent1].[Id] AS [Id], 
    (SELECT TOP (1) 
     [Extent3].[CategoryId] AS [CategoryId] 
     FROM [dbo].[CategoryLink] AS [Extent3] 
     WHERE ([Extent1].[Id] = [Extent3].[PodcastId]) AND ([Extent3].[CategoryId] = 1)) AS [C1] 
    FROM [dbo].[Podcast] AS [Extent1] 
    INNER JOIN [dbo].[PodcastStatus] AS [Extent2] ON [Extent1].[StatusId] = [Extent2].[Id] 
    WHERE [Extent2].[SysStatus] > 0 
) AS [Project2] 
WHERE [Project2].[C1] IS NOT NULL 

的querstion是怎麼做的查詢,所以我可以得到一個「正常」 inner join無子查詢?

謝謝。

+0

這只是houw EF建立查詢,沒有太多可以做的。 EF非常快速地使用子查詢。在一天結束時,執行計劃就是最重要的。我認爲這應該是可以的,因爲事實上,WHERE部分([Extent1]。[Id] = [Extent3]。[PodcastId])'是內連接。 –

回答

0

我不確定你想要完成什麼。許多一對多是不是從多到一個對象映射太大的不同,但您可以訪問來自雙方的關係:

using System.Data.Entity; // For .Include Extension 

// Eager-load Categories 
var podcasts = db.Prodcasts.Include(x => x.Categories); 
foreach (var p in podcats) 
{ 
    foreach (var c in p.Categories) 
    { 
    } 
} 

var categories = db.Categories.Include(x => x.Podcasts); 
foreach (var c in categories) 
{ 
    foreach (var p in c.Podcasts) 
    { 
    } 
} 

取決於你試圖完成你什麼可能還需要做這樣的事情:

from c in Customers 
join p in Purchases on c.ID equals p.CustomerID   // first join 
join pi in PurchaseItems on p.ID equals pi.PurchaseID  // second join 
select new 
{ 
c.Name, p.Description, pi.Detail 
} 

如果你是新來的LINQ我建議考慮看看LinqPad。它包含了很多例子,應該讓你知道它是如何工作的。

更新

你能否詳細說明,也許你真正想要得到什麼?

在我的第二個例子中的選擇也可以不帶PurchaseItems類來完成:

var q = (from p in db.Prodcasts 
     from c in p.Categories // note that it is using "p" instead of db.Categories 
     select new 
     { 
      Podcast = p.Name, 
      CategoryName = c.Name 
     }).ToList(); 
+0

問題是我的模型中沒有PurchaseItems類 - 只有Purchase和Customers,就像它在該文章中寫的那樣。在我的情況下 - 僅適用於播客和類別。現在我明白我必須爲CategoryLink表添加一個模型(PurchaseItem在你的案例中)。 –