簡體   English   中英

如何編寫where查詢,僅包含1個子實體

[英]How do I write a where query to only include 1 entity of child

我有實體

Blog{ blogId, name, creatorUserId }

BlogSettings{ blogId, userId, column1  }

現在,我有一個接受blogIduserId的方法,並且正在Blog查詢(不是BlogSettings

Blog包含BlogSettings集合。

我該怎么辦?

如果我編寫context.Blogs.Include("BlogSettings").Where( b => b.BlogId == blogId)會非常低效,因為我只需要userId == userId的BlogSettings。

Note:我不是在BlogSettings上查詢。 如您所見,我正在查詢Blog集合。

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;
    //
}

這樣的投影是在單次往返數據庫中獲得結果的唯一方法,因為通過Include急切加載不支持對包含的子集合進行任何過濾或排序。 如果blog.BlogSettings用更改跟蹤並且關系不是多對多的, 則將使用單個加載的BlogSetting自動填充BlogSetting 否則,您必須使用結果對象的屬性手動填充集合:

if (blogWithSetting != null)
{
    Blog blog = blogWithSetting.Blog;
    blog.BlogSettings = new List<BlogSetting>();
    blog.BlogSettings.Add(blogWithSetting.BlogSetting);
    //
}

盡管從概念BlogSettings ,您正在Blog查詢,但是您可能會發現,針對BlogSettings編寫查詢並添加.Include("Blog")更為有效。

BlogSettings您只有一個BlogSettings用於UserId和BlogId的組合; 也許這是由獨特的約束來實施的。 如果是這種情況,這將非常快:

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

這將要求您創建一個從BlogSettingsBlog的導航屬性,稱為Blog

這將在BlogBlogSettings表之間執行BlogSettings但只是實現BlogSetting實體。

var settings = context.Blogs.Where( b => b.BlogId == blogId && b.CreatorUserId = userId)
                            .SelectMany(x => x. BlogSettings);
context.Blogs.Include("BlogSettings").SingleOrDefault( b => b.BlogId == blogId);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM