.Net如何使用数据库中不存在的字段加载ViewModel?

时间:2012-03-21 02:05:16

标签: c# .net entity-framework viewmodel

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

假设我有名为Owners and Pets的实体模型:

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,但我只是想让这个例子保持简单)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

这样的东西
context.Owners.Select(o => new OwnerViewModel() 
                           {Owner = o, HasPets = o.Pets.Any()});  

并定义您的viewmodel,如:

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