1. ホーム
  2. c#

[解決済み】匿名型の結果を返す?

2022-04-17 19:25:49

質問

以下の簡単な例で、Linq to SQLを使用して複数のテーブルから結果を返すには、どのような方法が最も適していますか?

2つのテーブルがあるとします。

Dogs:   Name, Age, BreedId
Breeds: BreedId, BreedName

すべての犬を、その BreedName . このような方法で問題なくすべての犬を取得できるはずです。

public IQueryable<Dog> GetDogs()
{
    var db = new DogDataContext(ConnectString);
    var result = from d in db.Dogs
                 join b in db.Breeds on d.BreedId equals b.BreedId
                 select d;
    return result;
}

しかし、私は犬種で犬をしたい場合は、私は問題があることを試してみてください。

public IQueryable<Dog> GetDogsWithBreedNames()
{
    var db = new DogDataContext(ConnectString);
    var result = from d in db.Dogs
                 join b in db.Breeds on d.BreedId equals b.BreedId
                 select new
                        {
                            Name = d.Name,
                            BreedName = b.BreedName
                        };
    return result;
}

今、私はコンパイラがDogsを期待しているので、無名型のセットを返すことを許さないことを理解しています。 それとも DogsWithBreedNames で、その型をselectで指定するのでしょうか? それとも他にもっと簡単な方法があるのでしょうか?

どのように解決するのですか?

私はこのパターンで行くことが多いです。

public class DogWithBreed
{
    public Dog Dog { get; set; }
    public string BreedName  { get; set; }
}

public IQueryable<DogWithBreed> GetDogsWithBreedNames()
{
    var db = new DogDataContext(ConnectString);
    var result = from d in db.Dogs
                 join b in db.Breeds on d.BreedId equals b.BreedId
                 select new DogWithBreed()
                        {
                            Dog = d,
                            BreedName = b.BreedName
                        };
    return result;
}

クラスが1つ増えることになりますが、素早く簡単にコーディングでき、簡単に拡張でき、再利用可能でタイプセーフなのです。