我正在充实我的数据访问层,并且遇到了我的第一个问题。我首先使用Entity Framework代码以及一些存储库和asp.net Web API,以json格式显示数据。

我试图通过get方法从两个不同的poco获取数据。这些模型是:

public class Freelancer
{
    public int ID { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string CompanyName { get; set; }
    public string Avatar { get; set; }
    public Address FreelancerAddress { get; set; }
    public ICollection<Client> Clients { get; set; }
}


地址:

public class Address
{
    public int AddressId { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
}


最后是客户端对象列表:

public class Client
{
    public int ID { get; set; }
    public string Name { get; set; }
    public Address ClientAddress { get; set; }
    public string Logo { get; set; }
    public ICollection<Project> Projects { get; set; }
    public int FreelancerID { get; set; }
    public Freelancer Freelancer { get; set; }
}


在我的Api控制器中,我正在尝试执行以下操作(针对此问题进行了简化):

public IEnumerable<Freelancer> Get()
    {
        var user = Uow.Freelancers.GetFreelancer(1);
        var result = from x in user
                     select new
                     {
                         ID = x.ID,
                         Name = x.LastName,
                         Address = x.FreelancerAddress.Street
                     };
        return result;
    }


我得到的错误是这样的:


  无法隐式转换类型'System.Collections.Generic.IEnumerable'
      到“ System.Collections.Generic.IEnumerable”。
      存在显式转换(您是否缺少演员表?)


我可以很好地返回Freelancer对象,但是在Json中,即使有相关数据,它也将为地址和客户显示null。有没有办法使用linq获取我需要的对象,还是应该对DAL进行某种重新设计。我处于起步阶段,所以如果您有最佳实践建议,我正在寻找。

附加信息

这就是Uow.Freelancer.GetFreelancer(1)提供的服务。

[{"iD":1,"email":"[email protected]","password":"password","firstName":"David","lastName":"Stanley","companyName":null,"avatar":null,"freelancerAddress":null,"clients":null}]


GetFreelancer()看起来像这样:

public IEnumerable<Freelancer> GetFreelancer(int id)
    {
        IEnumerable<Freelancer> freelancer = (from x in DbSet
                         select x);
        return freelancer;
    }


我看不到任何使用.Reference或.Include的方法,但这可能是正确的方法。我记得在几个项目之前做了类似的事情...

有用!!*

这是需要发生的事情:

我将GetFreelancer方法更改为:

IEnumerable<Freelancer> freelancer = from x in DbSet
                                     .Include("FreelancerAddress")
                                     .Include("Clients")
                                             where x.ID == id
                                             select x;

        return freelancer;


最初由于Freelancer所引用的Client拥有对Freelance的完整引用而一开始不起作用,所以它永远都是隧道。我在客户端中删除了引用,因此它看起来像这样:

public class Client
{
    public int ID { get; set; }
    public string Name { get; set; }
    public Address ClientAddress { get; set; }
    public string Logo { get; set; }
    public ICollection<Project> Projects { get; set; }
    public int FreelancerID { get; set; }
}


我的输出正是我所需要的:自由职业者和他的地址,以及他的客户列表。

最佳答案

我还没有尝试过此代码,根据提供的代码以及我在Google上找到的内容,这简直就是我的脑海,但希望它能为您指明正确的方向。

我认为应该在GetFreeLancer方法中进行更改(就获取相关表而言)。我还注意到您没有在查询中使用提供的ID,这意味着您将按原样使用方法来向您提供表中的所有条目,因此在示例中添加了where子句。

我要在此处传达的基本思想是,当您获得所需的Freelancer记录时,将加载Address和Clients集合。我假设DbSet是您的上下文,并且我猜测的是实体名称。

public IEnumerable<Freelancer> GetFreelancer(int id)
{

    IEnumerable<Freelancer> freelancer = from x in DbSet.Freelancers
                                         .Include("Address")
                                         .Include("Client")
                                         where x.Id == id
                                         select x;

    return freelancer;
}


一旦返回正确的数据,您就应该能够在控制器方法中获得所需的一切。

就像我说的那样,我没有尝试过这段代码,但至少希望它可以帮助您前进。

我也建议使用LINQPad,因为它是测试和处理LINQ查询的好工具。

10-07 22:57