gpt4 book ai didi

c# - Entity Framework - 在一个查询中获取 'fake' 导航属性

转载 作者:行者123 更新时间:2023-11-30 17:03:05 25 4
gpt4 key购买 nike

我有一个 Product 表,它没有定义与 translation 表的关系。我将 Translation 属性作为 [NotMapped] 添加到 Product POCO。

**我的产品 POCO:**

public partial class Product
{
public int ProductID { get; set; }

public double Price { get; set; }

[NotMapped]
public virtual Translation Translation{ get; set; }

/** Other properties **/
}

我还有一个Translation 表,顾名思义,它包含所有的翻译。现在,可以通过提供三个参数从数据库中检索正确的翻译:LanguageIDTranslationOriginIDValueID

  • LanguageID:用户定义的语言的 ID。
  • TranslationOriginID:简单地说,“哪个表包含我想要翻译的实体?”换句话说,这个 ID 指向另一个包含所有可能来源的表。来源是可以具有翻译的表/实体。例如:本例中的来源是 Product
  • ValueID:这是我想要对其进行翻译的实体的 ID。

我的翻译 POCO:

public partial class Translation
{
public int TranslationID { get; set; }

public byte LanguageID { get; set; }

public short TranslationOriginID { get; set; }

public int ValueID { get; set; }

public string TranslationValue { get; set; }

/** Other properties **/

public virtual TranslationOrigin TranslationOrigin { get; set; }

public virtual Language Language { get; set; }
}

当我想检索所有产品及其Translation时,我执行以下代码:

List<Product> products = context.Products.ToList();

foreach (Product product in products)
{
product.Translation = context.Translations.FirstOrDefault(y => y.LanguageID == 1 && y.TranslationOriginID == 2 && y.ValueID == product.ProductID);
}

如您所见,我为列表中的每个产品执行另一个查询以获取翻译。

我的问题:是否可以在一次查询中获取所有产品及其翻译?甚至当我选择一个产品时我会自动检索正确的翻译?

我已经尝试了 .Include().Select()。它不起作用,也许我做错了什么?我也试过 this method ,也没用。

顺便说一句,我将 Entity Framework 5 与 .NET 4 结合使用(因此,Entity Framework 4.4)。

提前致谢。

问候语鲁腾


回答

根据Ed Chapel给出的例子,我想出了一个解决方案。

return (from p in context.Products
join t in context.Translations
on new
{
Id = p.ProductID,
langId = languageID,
tOriginId = translationOriginID
}
equals new
{
Id = d.ValueID,
langId = d.LanguageID,
tOriginId = d.TranslationOriginID
}
into other
from x in other.DefaultIfEmpty()
select new
{
Product = p,
Translation = x
})
.ToList().ConvertAll(x => new Product()
{
Code = x.Product.Code,
Translation = x.Translation,
/** Other properties **/
});

最佳答案

在大多数情况下,我不喜欢正确的 LINQ。然而,join 是 LINQ 比扩展方法更容易的场景:

from p in context.Products
join t in context.Translations
on t.ValueID equals p.ValueID
&& t.LanguageID == 1
&& t.TranslationOriginID == 2
into joinT
from x in joinT
select new {
Product = p,
Translation = t,
};

然后循环遍历结果设置 x.Product.Translation = x.Translation

关于c# - Entity Framework - 在一个查询中获取 'fake' 导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19021891/

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