如何对渴望获取进行排序和过滤
我如何做一个亲子关系的热切查询:
如果我尝试
from p in _context.Parents.Include("children")
join c in _context.childrenon p.Id equals c.ParentId
where d.DeletedDate == null
orderby p.Name ascending, c.Name
select p
然后我得到父对象,但每个父对象都有NULL
如果我尝试
from p in _context.Parents.Include("children")
orderby p.Name ascending
select p
查询返回所有父项和子项,但它们不被过滤或排序。
我想要的结果是IEnumerable<Parent>
ie
Parent[0].name = "foo"
Parent[0].children = IEnumerable<Child>
Parent[1].name = "bar"
Parent[1].children = IEnumerable<Child>
解决方案取决于你想要做什么。
第一个查询给人的印象是你想“平坦化”对象中的结果,就像这样(伪代码,我希望这很清楚我的意思):
{ Parent1, Child1 }
{ Parent1, Child2 }
{ Parent1, Child3 }
{ Parent2, Child1 }
在这种情况下,每个结果“行”将是一个具有Parent
和Child
属性的对象,您可以按父项名称和子项名称进行排序。
第二个查询只返回Parent
对象,(你不显示它,但我假设EF已经被指示这么做),每个对象都有一个Children
集合。 在这种情况下,您只能按父母名称排序; 如果您想对每个Parent
的孩子进行排序,请Children
对该对象上的Children
集合进行排序。
你想要做哪两项?
更新
好的,看起来你想要第二个。 我不相信它可以直接完成。 枚举结果时你可以做到这一点 - 因为Parent
已经被排序了,只需对每个人的子进行排序:
var sortedChildren = parent.Children.OrderBy(c => c.Name);
这样做没有直接的方法,但是您可以使用某种解决方法 - 将父项和子项投影到匿名对象上,然后从对象中选择并返回父项。
查看类似的问题:Linq To Entities - 如何过滤子实体
在你的情况下,你会有以下几点:
var resultObjectList = _context.
Parents.
Where(p => p.DeletedDate == null).
OrderBy(p => p.Name).
Select(p => new
{
ParentItem = p,
ChildItems = p.Children.OrderBy(c => c.Name)
}).ToList();
List<Parent> resultingCollection = resultObjectList.Select(o => o.ParentItem).ToList();
预取子字段:
using (BlogDataContext context = new BlogDataContext())
{
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Blog>(c => c.Categories);
options.LoadWith<Blog>(c => c.Title);
context.LoadOptions = options;
Blog blog = context.Blogs.Single<Blog>(c => c.BlogId == 1);
}
链接地址: http://www.djcxy.com/p/37647.html