0

2 つを含む Context をクエリし、EntityObjectsその結果を厳密に型指定されたインターフェイスのリストにキャストするシナリオがあります。

エンティティ オブジェクト

public class CompanyEntity : EntityObject
{
    public string Name { get; set; }
    public EntityCollection<StaffEntity> Staff { get; set; }
}

public class StaffEntity : EntityObject
{
    public string FullName { get; set; }
}

ドメイン オブジェクト

public class Company : IOrganisation
{
    public string Name { get; set; }
    public List<IPerson> Staff { get; set; }
}

public class StaffMember : IPerson
{
    public string FullName { get; set; }
}

インターフェイス

public interface IOrganisation
{
    string Name { get; set; }
    List<IPerson> Staff { get; set; }
}

public interface IPerson
{
    string FullName { get; set; }
}

を無視してStaffEntityをクエリするだけの場合、次のようCompanyEntityに a にキャストするのList<IOrganisation>は簡単です。

List<IOrganisation> orgs = (from c in context.Companies
                            select new Company
                            {
                                Name = c.Name 
                            }).ToList<IOrganisation>();

ただし、両方をクエリして、関連するオブジェクトをドメイン オブジェクトにEntityObjects投影し、オブジェクトのプロパティに割り当てることができるようにキャストすると、問題が発生します。StaffEntityStaffMemberList<IPerson>StaffCompany

私はいくつかのことを試しましたが、私が得た最も近いものは次のとおりでしたが、実行時にEFは呼び出しが好きではありませんでした.ToList<IPerson>():

List<IOrganisation> orgs = (from c in context.Companies.Include("Staff")
                            select new Company
                            {
                                Name = c.Name,
                                Staff = (from s in c.Staff
                                         select new StaffMember
                                         {
                                             FullName = s.FullName,
                                         }).ToList<IPerson>()
                            }
                            into results
                            select results).ToList<IOrganisation>();

したがって、基本的には、LINQ to Entities クエリを使用して、インターフェイスのリストのネストされたオブジェクト グラフを取得する必要があります。インターフェイスのリストとしてドメイン オブジェクトが必要な理由は、具体的なドメイン オブジェクトまたは Entity Framework への参照を持たない他のアセンブリに渡されるためですが、それらは実装するインターフェイスへの参照を持っています。さらに、インターフェイスを実装するのは適切ではないEntityObjectsので、私が尋ねている質問が可能かどうかを確認したいと思います。

前もって感謝します。

4

1 に答える 1

0

わかりました私はそれを解決しました。EF は私が望んでいたことを行うことができなかったのでEntityObjects、メソッドを使用して取得し、AsEnumerable()そこから LINQ to Qbjects を使用してコレクションでやりたいことを行うことができましたIEnumerable

実用的なソリューションは次のとおりです

List<IOrganisation> orgs = context.Companies.Include("Staff")
                               .AsEnumerable()
                               .Select(c => new Company
                               {
                                   CompanyName = c.CompanyName,
                                   Staff = c.Staff.Select(s => new StaffMember
                                                  {
                                                      FullName = s.FullName
                                                  }).Cast<IPerson>().ToList()
                               }).Cast<IOrganisation>().ToList();
于 2012-06-21T13:54:16.343 に答える