gpt4 book ai didi

linq - 最有效的 Entity Framework 代码第一种扁平化/投影父实体与特定子实体的方法

转载 作者:行者123 更新时间:2023-12-04 05:03:51 25 4
gpt4 key购买 nike

我有一个父实体 Widget拥有核心成员和多个WidgetTranslation具有语言翻译成员的 child ,即 Description提供英语、法语、德语等文本。

例如

public class Widget
{
public int Id { get; set; }
public string Code { get; set; }
public virtual ICollection<WidgetTranslation> WidgetTranslations { get; set; }
}

public class WidgetTranslation
{
public int WidgetId { get; set; }
public virtual Widget Widget { get; set; }

public int LanguageId { get; set; }
public virtual Language Language { get; set; }

public string Name { get; set; }
public string Description { get; set; }
public string Summary { get; set; }
}

查询小部件集合的最有效方法是什么,为给定的 LanguageId 展平& 投影到 TranslatedWidget DTO
public class TranslatedWidget
{
public int Id { get; set; }
public string Code { get; set; }
public int LanguageId { get; set; }
public virtual Language Language { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Summary { get; set; }
}

给定 languageId我已经开始了
DbSet.Select(w => new TranslatedWidget
{
Id = w.Id,
Code = w.Code,
LanguageId = w.LanguageId,
Name = w.WidgetTranslations.First(wt=>wt.LanguageId == languageId).Name,
Description = w.WidgetTranslations.First(wt=>wt.LanguageId == languageId).Description,
Summary = w.WidgetTranslations.First(wt=>wt.LanguageId == languageId).Summary
});

但我觉得这是低效的,并且不会扩展到 WidgetTranslation 上的更多属性。 .

谢谢

最佳答案

使用 SelectMany 通过单个连接展平结构:

var widgetQuery = from w in dbSet.Widgets
from wt in w.WidgetTranslations
where wt.Language == languageId
select new TranslatedWidget
{
Id = w.Id,
Code = w.Code,
LanguageId = w.LanguageId,
Name = wt.Name,
Description = wt.Description,
Summary = wt.Summary
});

我在这里假设您对于给定语言的每个小部件只有一个翻译。

关于linq - 最有效的 Entity Framework 代码第一种扁平化/投影父实体与特定子实体的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15763744/

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