2017-12-05 11 views
1

顧客は複数のアドレスを持つことができますが、優先アドレスは1つしかないと仮定します。モデルクラスのプロパティで優先アドレスのみが保持され、ラムダ式を別のオブジェクト、たとえばOrderで使用するようにするにはどうすればよいですか? エンティティフレームワークの関係 - 優先顧客アドレス

私のモデルクラス

は次のようになります。

「指定された型のメンバー:私はエラーが言ってもらうしかし

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

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;} 
} 

私はこれが働きたいです「PreferredAddress」は、エンティティへのLINQ ではサポートされていません。イニシャライザ、エンティティメンバ、およびエンティティのナビゲーションのみ のプロパティがサポートされています。

+0

残念ながら、Entity FrameworkにはNHibernateの持つ数式プロパティが不足しています。それは素晴らしい機能だろう。このアドレスが日常的に必要な場合は、ビューモデル/ DTOクラスとAutoMapperを使用します。 –

答えて

0

できません。それは不可能。エンティティに対してLinqを使用しているため、これらのLinq文がSQLクエリに変換されています。したがって、PreferredAddressプロパティに相当するSQLはありません。この理由から、ステートメントをSQL照会に変換することはできません。

だから、このように試してみてください。

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

FirstOrDefault()だけでは私に優先アドレスが与えられません。多分FirstOrDefault(x => x.Preferred)を意味します。それでも、私はその解決策が気に入らない、それは私の意見では醜いものだ。ステートメントをSQL照会に変換することはできません。すべての顧客の優先アドレスのみを表示し、そのビューにプロパティをマップするビューを作成するとどうなりますか?それは働くだろうか?エンティティの設定はどのように見えますか? – ornstai

+0

はい、私はそれを意味します。ところで、SQLと同等の「PreferredAddress」を実行するビューを作成することができます。エンティティを変更するか、新しいビューを処理するために新しいエンティティを作成する必要があります。そして、それは管理するのが難しいでしょう。しかし、私はそれが過剰工学であると思う。 – lucky

関連する問題