Include 中使用的 Lambda 表达式无效。 EF6,导航属性

Posted

技术标签:

【中文标题】Include 中使用的 Lambda 表达式无效。 EF6,导航属性【英文标题】:Lambda expression used inside Include is not valid. EF6, Navigation Property 【发布时间】:2020-03-12 05:58:23 【问题描述】:

我试图解决多对多关系。在数据库级别上,一切对我来说都很好,但是当我尝试获取该数据时(inlcude),它失败了。

我明白了:

Include 中使用的 Lambda 表达式无效。

我所说/尝试过的:

var readRecipes = db.MyClasses. 
                     Include(blog => blog.SomeCollections).ThenInclude(post => post.Prop1).
                     Include(blog => blog.SomeCollections).ThenInclude(post => post.Prop2).

结构

主类:

public class MainClass
// ...                   
public ICollection<NavigationProperty> NavigationPropertys; 
// ...               
public MainClass()


    this.NavigationPropertys = new Collection<NavigationProperty>(); 


导航属性:

public class NavigationProperty
    
        public Guid ID  get; set; 



        [Required]
        public Guid? Prop1ID  get; set; // 0,*

        [Required]
        public Guid? Prop2ID  get; set; // 0,*

        [Required]
        public Guid MainClassID  get; set; 



        [Required]
        public Prop1 Prop1  get; set; 

        [Required]
        public Prop2 Prop2  get; set; 




        public MainClass MainClass  get; set; 



        [Required]
        public float Amount  get; set; 


        public NavigationProperty()
        
            // todo: ?
        
    

我不知道,我做错了什么?

【问题讨论】:

嗯,所以 Recipes = MainClassSomeCollection = NavigationProperty ?您可以通过仅包含必要的属性来改进您的帖子。它使阅读更容易。 @Dennis1679 你是对的,我更正了。我应该包括Prop1Prop2 吗? 【参考方案1】:

好的,我解决了我的问题。

代替:

public ICollection<NavigationProperty> NavigationPropertys; 

我应该使用:

public ICollection<NavigationProperty> NavigationPropertys  get; set; ; 

这导致 Lambda 崩溃。

谢谢。

【讨论】:

非常感谢!你节省了我的时间:)【参考方案2】:

如果您还想包含导航属性的子项,您应该这样做:

Parent.Include(p => p.Children.Select(c => c.GrandChild));

或者如果每个孩子有很多孙子

Parent.Include(p => p.Children.SelectMany(c => c.GrandChildren));

或者如果每个父母只有一个孩子和一个孙子。

Parent.Include(p => p.Child.GrandChild);

我希望这会有所帮助。

编辑: 我没有意识到你的问题是关于 ef-core。我以为是某种伪代码或自制的扩展方法。

您是否阅读过 Microsoft 提供的有关此主题的 all the examples?否则,恐怕我没有足够的信息来帮助您解决这件事。

我需要看看你如何配置Prop1 和导航实体之间的关系。我在您的模型中没有看到外键。当然,这不是必需的,具体取决于您如何使用modelBuilder 中的modelBuilder 在覆盖的OnModelCreating 方法中配置关系,或者您如何使用属性来指示关系。有关 ef-core 中关系和指定关系的更多信息,请参阅here。

【讨论】:

您的示例公然跳过了.ThenInclude 的使用,这是专门为包含多级继承而设计的。它可能有效,但你没有提供他应该支持SelectMany 而不是ThenInclude 的理由, 你是对的。但 OP 明确指出: Include 中使用的 Lambda 表达式无效。但是您在他的标签中是对的,他间接表示他正在询问 ef-core。我会看看我是否可以修改我的答案。谢谢

以上是关于Include 中使用的 Lambda 表达式无效。 EF6,导航属性的主要内容,如果未能解决你的问题,请参考以下文章

参数不匹配; lambda 表达式的无效函数描述符

将 Entity Framework 4 中的 Include 与 lambda 表达式一起使用

c++ 11之 lambda表达式的使用

c++ 11之 lambda表达式的使用

VS Code 中的 Lambda 表达式 C++ 错误

C# 编译器错误:无法转换 lambda 表达式