这个小组加入有什么问题吗?

本文关键字:什么 问题 | 更新日期: 2023-09-27 17:53:42

我有一个Profile类,它有一个父亲属性,它的自我引用到自己,我想在一个sql连接语句中加载一个配置文件和它的父亲配置文件

Select * FROM profile left join profile as father on profile.fatherid = father.id where profile.id = 650
所以我创建了下面的linq语句,但是没有运行sql语句,而是运行下面的语句
select * from profiles
select * from profiles where id = 650

然后在内存中将它们分组在一起,但显然我不想加载整个数据库。

    private class Result
    {
        public Profile Profile { get; set; }
        public IEnumerable<Profile> Fathers { get; set; }
    }
    private Result MapFather(Profile p, IEnumerable<Profile> father)
    {
        return new Result() {Profile = p, Fathers = father.DefaultIfEmpty()};
    }
   var profiles = from p in db.Profiles where p.ID.Equals(650) select p;
   var fathers = from f in db.Profiles select f;
   var groupJoin = profiles.GroupJoin(fathers,
                                        p => p.FatherID, 
                                        f => f.ID, 
                                        MapFather).ToList();

这个小组加入有什么问题吗?

您对GroupJoin()的调用正在获得IEnumerable版本,因为您对MapFather的调用是一个Func<>而不是Expression>。因此,对概要文件和父文件的调用在GroupJoin之前执行。

尝试内联MapFather():

var groupJoin = profiles.GroupJoin(fathers,
                                    p => p.FatherID, 
                                    f => f.ID, 
                                    (p, fathers) => new Result() {Profile = p, Fathers = father.DefaultIfEmpty()}).ToList();