gpt4 book ai didi

c# - Include 属性 lambda 表达式 [...] 无效。该表达式应该代表属性访问

转载 作者:行者123 更新时间:2023-12-02 03:11:23 25 4
gpt4 key购买 nike

我正在尝试获取所有修补程序并包含属性 Available 为 1 的所有详细信息(与其关联)。这是我的代码:

public static IList<HotFix> GetAllHotFix()
{
using (Context context = new Context())
{
return context.HotFix
.Include(h => h.AssociatedPRs)
.Include(h => h.Detail.Where(d => d.Available = 1))
.ToList();
}
}

我收到了这个错误。我尝试使用 .ThenInclude 但无法解决它。

在 HotFix 中我有:

[Required]
public virtual List<HotFixDetail> Detail { get; set; }

最佳答案

虽然您忘记编写类定义,但似乎您有一个 HotFix 类。每个 HotFix 都有一个由零个或多个 AssociatedPRs 组成的序列以及一个由零个或多个 Details 组成的序列。

每一个Detail都至少有一个数字属性Available

您需要所有HotFixes,每个都有其所有AssociatedPR,以及所有具有属性AvailableDetails值等于 1(您不是说 available 是 bool 值吗?)

在使用 Entity Framework 时,人们倾向于使用 include 来获取项目及其子项目。这并不总是最有效的方法,因为它获取表的完整行,包括您不打算使用的所有属性。

例如,如果您有一对多关系,学校及其学生,那么每个学生都会有一个学校的外键 该“学生参加”。

因此,如果学校 [10] 有 1000 名学生,则每个学生 都将拥有一个指向学校 的外键,其值为 10。如果您使用 Include 获取 School [10] 及其 Students,则该外键值也会被选中,并发送 1000 次。您已经知道它将等于 Schools 主键值,因此传输该值 10 到 1001 次会浪费处理能力。

When querying data, always use Select, and Select only the properties you actually plan to use. Only use Include if you plan to update the fetched data.

另一个好建议是使用复数来描述序列,使用单数来描述序列中的一项

您的查询将是:

var result = context.HotFixes.Select(hotfix => new
{
// Select only the hotfix properties you actually plan to use:
Id = hotfix.Id,
Date = hotfix.Date,
...

AssociatedPRs = hotfix.AssociatedPRs.Select(accociatedPr => new
{
// again, select only the associatedPr properties that you plan to use
Id = associatedPr.Id,
Name = associatedPr.Name,
...

// foreign key not needed, you already know the value
// HotFixId = associatedPr.HotFixId
})
.ToList(),

Details = hotfix.Details
.Where(detail => detail.Available == 1)
.Select(detail => new
{
Id = detail.Id,
Description = detail.Description,
...

// not needed, you know the value:
// Available = detail.Available,

// not needed, you know the value:
// HotFixId = detail.HotFixId,
})
.ToList(),
});

我使用了匿名类型。您只能在定义匿名类型的过程中使用它。如果需要返回获取的数据,则需要将所选数据放入一个类中。

return context.HotFixes.Select(hotfix => new HotFix()
{
Id = hotfix.Id,
Date = hotfix.Date,
...

AssociatedPRs = hotfix.AssociatedPRs.Select(accociatedPr => new AssociatedPr()
{
... // etc

注意:您仍然不必填写所有字段,除非您的功能需求明确说明了这一点。

函数的用户可能会感到困惑,因为他们不知道哪些字段将被实际填充,哪些字段不会被填充。另一方面:当向数据库添加项目时,他们已经习惯了不填写所有字段,例如主键和外键。

作为并非所有字段都被填充的解决方案,一些开发人员设计了一个额外的层:存储库层(使用存储库模式)。为此,他们创建了代表人们想要放入存储和想要保存到存储中的数据的类。通常这些人对数据保存在关系数据库中(带有外键之类的东西)不感兴趣。因此存储库类不会有外键

存储库模式的优点是,存储库层隐藏了存储系统的实际结构。它甚至隐藏了它是一个关系数据库。它也可能位于 JSON 文件中。如果数据库发生变化,存储库层的用户不必知道这一点,并且可能也不需要更改。

存储库模式还可以更轻松地模拟数据库以进行单元测试:由于用户不知道数据位于关系数据库中,因此对于单元测试,您可以将日期保存在 JSON 文件或 CSV 中- 文件或其他任何内容。

缺点是您需要编写额外的类来保存要放入存储库或从存储库中获取的数据。

添加这个额外层是否明智,取决于您期望数据库将来更改布局的频率,以及您的单元测试需要有多好。

关于c# - Include 属性 lambda 表达式 [...] 无效。该表达式应该代表属性访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57479695/

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