2

私はデータ アクセス層を肉付けしていて、最初の問題に遭遇しました。最初に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; }
}

そして、私の出力はまさに私が必要としていたものです: フリーランサーと彼の住所、そして彼のクライアントのリスト。

4

1 に答える 1

2

私はこのコードを試していません。これは、提供されたコードと 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 クエリをテストおよび操作するための優れたツールです。

于 2012-09-30T17:43:40.050 に答える