.Net如何加载带有字段的ViewModel;数据库中不存在

本文关键字:ViewModel 字段 数据库 不存在 何加载 加载 Net | 更新日期: 2023-09-27 18:28:40

我如何查询DB以返回除实体模型描述之外还包含字段的项目列表>

假设我有实体模型称为主人和宠物:

public class Owner
{
    public int OwnerID{ get; set; }
    public virtual IEnumerable<Pets> Pets{ get; set; }
}
public class Pet
{
    public int PetID{ get; set; }
    public string PetName{ get; set; }
    public int OwnerID{ get; set; }
    public Owner Owner{ get; set; }
}

如果我有这样的所有者列表:

dbContext.Set<Owner>().ToList()

该列表中的每个对象都是一个拥有OwnerID的所有者和他们宠物的列表。

但是,如果我想为每个所有者添加一个额外的字段,比如"HasPets",并有一个接受这一点的视图模型列表,该怎么办。

public class OwnerViewModel
{
    public int OwnerID{ get; set; }
    public bool HasPets{ get; set; }
}
List<OwnerViewModel> OwnerViewModels = ....(get list with added field)

我不知道如何查询数据库以包含一个新的计算字段。。。

(我意识到我可以简单地计算一下Owner.Pets,但我只是想让例子简单一点)

.Net如何加载带有字段的ViewModel;数据库中不存在

@Kamyar非常正确,我唯一会做的不同之处是使用.Any()而不是.Count() > 0

context.Owners
            .Select(o => new OwnerViewModel
                                {
                                    OwnerID = o.OwnerID,
                                    HasPets = o.Pets.Any().
                                    ...
                                    ...
                                });

类似的东西

context.Owners.Select(o => new OwnerViewModel() 
                           {Owner = o, HasPets = o.Pets.Any()});  

并定义您的视图模型,如:

public class OwnerViewModel
{
    public Owner Owner{ get; set; }
    public bool HasPets{ get; set; }
}

或者你可以在客户端加载所有宠物,并在那里检查它们(当然不建议过载):

public class OwnerViewModel
{
    public Owner Owner{ get; set; }
    public bool HasPets{ get { return this.Owner.Pets.Any(); } }
}  
var ownervms = new List<OwnerViewModel>();
foreach (var owner in context.Owners)
{
    ownervms.Add(new OwnerViewModel() {Owner= owner});
}