我有一个场景,我想查询包含两个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
,那么将其转换为List<IOrganisation>
是直接的,如下所示:
List<IOrganisation> orgs = (from c in context.Companies
select new Company
{
Name = c.Name
}).ToList<IOrganisation>();
但是,当我想查询EntityObjects
并将关联的StaffEntity
对象投影到StaffMember
域对象,然后将它们强制转换为List<IPerson>
以便将它们分配给Company
对象的Staff
属性时,我遇到了问题。
我尝试了很多方法,最接近的方法如下,但在运行时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查询检索接口列表的嵌套对象图。我需要域对象作为接口列表的原因是,它们被传递到其他程序集,这些程序集没有引用具体的域对象或实体框架,但它们确实引用了它们实现的接口。此外,EntityObjects
不适合实现接口,所以我想看看我提出的问题是否可行。
提前谢谢。
好的,我解决了它。EF不能做我想要的事情,所以我使用AsEnumerable()
方法检索我的EntityObjects
,从那里我可以使用LINQ到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();