一尘不染

返回匿名类型结果?

c#

使用下面的简单示例,使用Linq将多个表中的结果返回到SQL的最佳方法是什么?

说我有两个表:

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并在选择中指定该类型?还是有另一种更简单的方法?


阅读 254

收藏
2020-05-19

共1个答案

一尘不染

我倾向于这种模式:

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

这意味着您有一个额外的类,但是它快速且易于编码,易于扩展,可重用且类型安全。

2020-05-19