0

我有一个场景,我想查询一个包含两个的 ContextEntityObjects并将结果转换为强类型的接口列表。

实体对象

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,将其转换为 aList<IOrganisation>是直截了当的,如下所示:

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

但是,当我想查询两者EntityObjects并将关联的StaffEntity对象投影到StaffMember域对象时遇到问题,然后将它们转换为List<IPerson>以便可以将它们分配给对象的Staff属性Company

我已经尝试了很多东西,我得到的最接近的是如下,但是在运行时 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,所以我想看看我问的问题是否可能。

提前致谢。

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 回答