gpt4 book ai didi

c# - EF Code First - 预先加载和过滤子类属性(继承)

转载 作者:行者123 更新时间:2023-12-02 22:10:05 24 4
gpt4 key购买 nike

我有以下类(class)(过于简化):

public class Person
{
public int ID { get; set; }
}
public class Content
{
public int ID { get; set; }
}
public class Image : Content
{
public bool Private { get; set; }
public Person Author { get; set; }
}
public class Tag
{
public int ID { get; set; }
public Content Content { get; set; }
public Person Person { get; set; }
}

我想获取所有 Tags,其中 ContentImageImage 是不是 Private(同时急切地加载 Image 的属性)。尝试执行此操作但不起作用的示例:

var tags = context.Tags
.Include("Content.Author")
.Include("Person")
.Where(t => !((Image)t.Content).Private);

我收到以下错误:

Unable to cast the type 'Content' to type 'Image'. LINQ to Entities only supports casting EDM primitive or enumeration types.

并且删除了 Where 子句:

A specified Include path is not valid. The EntityType 'Content' does not declare a navigation property with the name 'Author'.

我需要什么样的查询和/或模型模式更改才能实现这种方法?

最佳答案

您可以按以下方式在 Where 子句中编写过滤器:

.Where(t => t.Content is Image && !(t.Content as Image).Private)

但是,更大的问题是Include 部分。 Author 属性仅存在于派生类型 ImageInclude 将尝试加载基本类型 Content(没有 Author 属性),因为这是 Tag 中导航属性 Content 的类型。您只是不能在此处使用 Include

您可以尝试将查询重写为投影:

var tags = context.Tags
.Where(t => t.Content is Image && !(t.Content as Image).Private)
.Select(t => new
{
Tag = t,
Image = t.Content as Image, // possibly this line is not needed
Author = (t.Content as Image).Author,
Person = t.Person
})
.AsEnumerable()
.Select(x => x.Tag)
.ToList();

只要您不禁用更改跟踪(例如使用 AsNoTracking),EF 应该自动将对象图放在一起,以便加载的标签具有填充的 ContentContent.AuthorPerson 属性(好像您已经使用 Include 加载了导航属性)。

顺便说一句:要求包含派生类型的导航属性的功能here on UserVoice .这与您的情况不完全相同,但在评论部分中甚至对您的情况提出了要求。

关于c# - EF Code First - 预先加载和过滤子类属性(继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15452192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com