1

エンティティがあります

Blog{ blogId, name, creatorUserId }

BlogSettings{ blogId, userId, column1  }

今、私は受け入れるメソッドを持ってblogIdおり、私は(not )userIdを照会していますBlogBlogSettings

Blogのコレクションが含まれていますBlogSettings

どうすればいいですか?

context.Blogs.Include("BlogSettings").Where( b => b.BlogId == blogId)userId == userId の BlogSettings しか必要ないので、これを書くと非常に非効率的です。

Note:私は BlogSettings でクエリを実行していません。ご覧のとおり、ブログ コレクションに対してクエリを実行しています。

4

4 に答える 4

1
var blogWithSetting = context.Blogs
    .Where(b => b.BlogId == blogId)
    .Select(b => new
    {
        Blog = b,
        BlogSetting = b.BlogSettings.FirstOrDefault(bs => bs.UserId == userId)
    })
    .SingleOrDefault();

if (blogWithSetting != null)
{
    Blog blog = blogWithSetting.Blog;
    //
}

このようなプロジェクションは、データベースへの 1 回のラウンドトリップで結果を取得する唯一の方法Includeです。これは、含まれる子コレクションでのイーガー ロードがフィルター処理や並べ替えをサポートしていないためです。変更の追跡を無効にしておらず、リレーションシップが多対多でない場合、blog.BlogSettings単一の loaded が自動的に取り込まれます。それ以外の場合は、結果オブジェクトのプロパティを使用してコレクションを手動で埋める必要があります。BlogSetting

if (blogWithSetting != null)
{
    Blog blog = blogWithSetting.Blog;
    blog.BlogSettings = new List<BlogSetting>();
    blog.BlogSettings.Add(blogWithSetting.BlogSetting);
    //
}
于 2012-06-04T17:40:15.723 に答える
0

概念的にはに対してクエリを実行していますが、 に対してクエリを記述してを追加するBlog方が効率的である場合があります。BlogSettings.Include("Blog")

BlogSettingsUserId と BlogId の組み合わせは 1 つしかないはずです。おそらく、これは一意の制約によって強制されます。その場合、これは非常に高速です。

    var blogAndSettings = (from s in context.BlogSettings
                                            .Include("Blog")
                           where s.BlogId = blogId && s.UserId = userId
                           select s).SingleOrDefault();

BlogSettingsこれには、 fromとBlog呼ばれるナビゲーション プロパティを作成する必要がありますBlog

于 2012-06-04T17:53:35.377 に答える
0

Blogこれにより、 とBlogSettingsテーブル間の結合が実行されますが、BlogSettingエンティティが実体化されるだけです。

var settings = context.Blogs.Where( b => b.BlogId == blogId && b.CreatorUserId = userId)
                            .SelectMany(x => x. BlogSettings);
于 2012-06-04T17:58:09.197 に答える
-1
context.Blogs.Include("BlogSettings").SingleOrDefault( b => b.BlogId == blogId);
于 2012-06-04T17:58:03.813 に答える