0

Podcast、Category、CategoryLinkの3つのテーブルを作成しました。CategoryLinkテーブルには、PodcastIdとCategoryIdの2つの列のみが含まれます。この記事で書いたように、これらのテーブル間の多対多の関係について説明しました。すべて正常に動作しますが、クエリを正しく行う方法がわかりません。今、私は次の方法でこれを行います:

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

問題は、サブクエリなしで「通常」を取得できるようにクエリを実行する方法inner joinです。

ありがとう。

4

1 に答える 1

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を確認することをお勧めします。それがどのように機能するかについてのアイデアを与えるはずのかなりの数の例が含まれています。

更新

実際に何を手に入れたいのか詳しく教えていただけますか?

PurchaseItems2番目の例の選択は、クラスなしでも実行できます。

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();
于 2012-05-21T10:49:20.200 に答える