C# 使用Lambda/Linq EF C从3个模型中获取值,其中1个模型是主根

C# 使用Lambda/Linq EF C从3个模型中获取值,其中1个模型是主根,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,大家好, 我正在尝试使用EF从数据库检索数据 我有3个这3个样品模型 public class Info { [Key] public int InfoId {get;set;} public string infoName {get;set;} public ICollection<SubInfo> SubInfo {get;set;} } public class SubInfo { [Key] public int SubInfoId

大家好,

我正在尝试使用EF从数据库检索数据

我有3个这3个样品模型

public class Info { 
    [Key] public int InfoId {get;set;}
    public string infoName {get;set;}

    public ICollection<SubInfo> SubInfo {get;set;}
 }

 public class SubInfo { 
    [Key] public int SubInfoId {get;set;}
    public string subInfoName {get;set;}

    public Info Info {get;set}
    public int InfoId {get;set;}
    public ICollection<SubSubInfo> SubSubInfo {get;set;}
 }

 public class SubSubInfo { 
    [Key] public int SubSubInfoId {get;set;}
    public string subInfoName {get;set;}

    public SubInfo SubInfo {get;set}
    public int SubInfoId {get;set;}
 }
但问题是,SubSubInfo在结果中是空的


我尝试过:var info=context.info.Includex=>x.SubInfo.Selecty=>y.SubSubInfo;但是我得到一个错误,上面写着:invalidoOperationException:Include属性lambda表达式'x=>…

当您使用多个Include时,您必须首先包含第一个级别。 在您的示例中:

var info = context.Info.Include(x=> x.SubInfo)
                       .Include(x=> x.SubInfo.Select(y=> y.SubSubInfo ));
如果使用EF Core,也可以使用Include。 有关更多信息,请参阅下面的链接

使用多个包含时,必须首先包含第一个级别。 在您的示例中:

var info = context.Info.Include(x=> x.SubInfo)
                       .Include(x=> x.SubInfo.Select(y=> y.SubSubInfo ));
如果使用EF Core,也可以使用Include。 有关更多信息,请参阅下面的链接

您想要实现的目标可以通过热切的加载轻松实现,您可以阅读更多关于它的信息。您得到的错误是,在您的案例中,无法将LINQ与原始SQL Include和Select结合起来

换句话说,您正试图加载多个实体,这可以通过使用类似以下代码来实现:

var info = context.Info.Include("SubInfo.SubSubInfo").ToList();
编辑开始

您希望加载多个级别,这是通过Include和Include方法实现的。例如

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
            .ThenInclude(post => post.Author)
        .ToList();
}
在你的背景下,它将是:

var info = context.Info.
           Include(subInfo => subInfo.SubInfo).
           ThenInclude(subSubInfo => subSubInfo.SubSubInfo).
           ToList();
其中SubInfo和SubSubInfo是模型中的导航属性。还要考虑一下您是否使用.NETCore或.NETFramework,因为.NETCore不支持延迟加载

但我看到@AliJP已经回答了你的问题

编辑结束


如果您想了解更多关于此主题的信息,请尝试阅读有关快速加载和延迟加载的内容

您想要实现的目标可以通过热切的加载轻松完成,您可以阅读更多关于它的信息,或者。您得到的错误是,在您的案例中,无法将LINQ与原始SQL Include和Select结合起来

换句话说,您正试图加载多个实体,这可以通过使用类似以下代码来实现:

var info = context.Info.Include("SubInfo.SubSubInfo").ToList();
编辑开始

您希望加载多个级别,这是通过Include和Include方法实现的。例如

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
            .ThenInclude(post => post.Author)
        .ToList();
}
在你的背景下,它将是:

var info = context.Info.
           Include(subInfo => subInfo.SubInfo).
           ThenInclude(subSubInfo => subSubInfo.SubSubInfo).
           ToList();
其中SubInfo和SubSubInfo是模型中的导航属性。还要考虑一下您是否使用.NETCore或.NETFramework,因为.NETCore不支持延迟加载

但我看到@AliJP已经回答了你的问题

编辑结束


如果您想了解更多关于此主题的信息,请尝试阅读有关快速加载和延迟加载的内容

我试过了。但它抛出了一个表示类似InvalidOperationException的错误:包含属性lambda表达式“x=>{from SubInfo y in x.SubInfo select[y].subsubsubinfo}”无效。表达式应表示属性访问:“t=>t.MyProperty”。要将在派生类型上声明的导航作为目标,请指定目标类型的显式类型lambda参数,例如“derived=>d.MyProperty”。但是,由于我使用的是EF-Core,因此include可以正常工作。谢谢你,先生,tipI试过了。但它抛出了一个表示类似InvalidOperationException的错误:包含属性lambda表达式“x=>{from SubInfo y in x.SubInfo select[y].subsubsubinfo}”无效。表达式应表示属性访问:“t=>t.MyProperty”。要将在派生类型上声明的导航作为目标,请指定目标类型的显式类型lambda参数,例如“derived=>d.MyProperty”。但是,由于我使用的是EF-Core,因此include可以正常工作。先生,谢谢你的tipI。我有一个错误,说NullReferenceException:Object reference未设置为对象的实例。从现在起我编辑了我的帖子,我发现我犯了一个错误。我有一个错误,说NullReferenceException:Object reference未设置为对象的实例。我编辑了我的帖子,从现在起我看到我已经我犯了一个错误。