【问题标题】:Entity Framework Relationships - Preferred Customer Address实体框架关系 - 首选客户地址
【发布时间】:2017-12-06 21:58:32
【问题描述】:

假设客户可以有多个地址,但只有一个“首选”地址。如何使模型类上的属性仅包含首选地址并通过另一个对象(例如 Order)使用 lambda 表达式工作?

我的模型类如下所示:

public class Cusotmer
{
   public virtual int Id {get; set;}
   public virtual HashSet<Address> Addresses {get; set;}
   public virtual Address PreferredAddress => Addresses.FirstOrDefault(x => x.Preferred)
}

public class Order
{
    public virtual int Id {get; set;}
    public virtual Customer Customer {get; set;}
}

我希望这个工作:

_context.Order.Where(x => x.Id == 20).Select(x => x.Person.PreferredAddress);

但是我收到一条错误消息:

"LINQ 不支持指定的类型成员 'PreferredAddress' 到实体。只有初始化器、实体成员和实体导航 支持属性。”

【问题讨论】:

  • 不幸的是,Entity Framework 缺少 NHibernate 所具有的公式属性。这将是一个很棒的功能。如果您经常需要此地址,请使用视图模型/DTO 类和 AutoMapper。

标签: c# entity-framework linq


【解决方案1】:

你不能。这不可能。因为您正在使用 Linq 到实体,并且这些 Linq 语句正在转换为 SQL 查询。所以,PreferredAddress 属性没有等效的 SQL。由于这个原因,该语句无法转换为 SQL 查询。

那么,你为什么不试试这样呢?

_context.Order.Where(x => x.Id == 20).Select(x => x.Person.Addresses.FirstOrDefault(x => x.Preferred));

【讨论】:

  • FirstOrDefault() 单独不会给我首选地址,也许您的意思是 FirstOrDefault(x => x.Preferred)。不过,我不喜欢这种解决方案,在我看来它有点丑陋。您确实提到该语句无法转换为 SQL 查询。如果我创建一个只显示所有客户的首选地址并将属性映射到该视图的视图会怎样?那会奏效吗?这在实体配置中看起来如何?
  • 是的,我是这个意思。顺便说一句,您可以创建一个视图来为 SQL 执行等效的“PreferredAddress”。您应该更改实体或创建一个新实体来处理新视图。而且会很难管理。但我认为,这将是过度设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多