私はデータ アクセス層を肉付けしていて、最初の問題に遭遇しました。最初にEntity Frameworkコードをいくつかのリポジトリとasp.net Web APIとともに使用して、json形式でデータを表示しています。
get メソッドで提供される 2 つの異なる 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; }
}
そして最後に 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; }
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 を参照していたため、これは最初は機能しませんでした。クライアントの参照を削除したので、代わりに次のようになります。
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; }
}
そして、私の出力はまさに私が必要としていたものです: フリーランサーと彼の住所、そして彼のクライアントのリスト。