[英]How do I write a where query to only include 1 entity of child
我有實體
Blog{ blogId, name, creatorUserId }
BlogSettings{ blogId, userId, column1 }
現在,我有一個接受blogId
和userId
的方法,並且正在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();
這將要求您創建一個從BlogSettings
到Blog
的導航屬性,稱為Blog
。
這將在Blog
和BlogSettings
表之間執行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.