我正在充实我的数据访问层,并且遇到了我的第一个问题。我首先使用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查询的好工具。