2

我正在充实我的数据访问层并遇到了我的第一个问题。我首先使用实体​​框架代码以及一些存储库和 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":"david.stanley.13@gmail.com","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 引用了完全引用 Freelance 的 Client,所以它永远隧道。我删除了 Client 中的引用,所以它看起来像这样:

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; }
}

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

4

1 回答 1

2

我没有尝试过这段代码,根据提供的代码和我通过谷歌找到的代码,这只是我的想法,但希望它能让你指出正确的方向。

我认为应该在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 查询的好工具。

于 2012-09-30T17:43:40.050 回答