返回具有不同模型类型的列表或数组

时间:2016-01-25 20:41:29

标签: c# asp.net entity-framework

我有以下代码:

        BandProfileModel BandProfile;
        MusicanProfileModel MusicanProfile;
        RegularProfileModel RegularProfile;

        using (AppDbContext ctx = new AppDbContext())
        {
            var rolesForUser = userManager.GetRoles(UserId);
            if(rolesForUser.Count() <= 0)
            {
                return View("SetupNewProfile");
            }

            //This below don't work: Canno't implicity convert type "System.Linq.IQueryable"....
            BandProfile = ctx.BandProfiles.Where(u => u.UserId == UserId);
            MusicanProfile = ctx.MusicanProfiles.Where(u => u.UserId == UserId);
            RegularProfile = ctx.RegularProfiles.Where(u => u.UserId == UserId);
        }

        return View(Profiles);

我想将BandProfile,MusicanProfile和RegularProfile合并到一个数组或列表中并将其返回到视图中,但我不知道该怎么做。

如何将不同的类/模型类型合并到一个数组/列表中?

2 个答案:

答案 0 :(得分:3)

如果您对这些类型有抽象,则可以返回此抽象的列表。它可以是interfaceabstract class,甚至是所有类型都继承的简单class。该选项可以是返回System.Object(。net)或object(在C#中)的集合。样本

var result = new List<object>();

using (AppDbContext ctx = new AppDbContext())
{
    var rolesForUser = userManager.GetRoles(UserId);
    if(rolesForUser.Count() <= 0)
    {
        return View("SetupNewProfile");
    }

    var bandProfile = ctx.BandProfiles.Where(u => u.UserId == UserId).ToList();
    var musicanProfile = ctx.MusicanProfiles.Where(u => u.UserId == UserId).ToList();
    var regularProfile = ctx.RegularProfiles.Where(u => u.UserId == UserId).ToList();

    result.AddRange(BandProfile);
    result.AddRange(MusicanProfile);
    result.AddRange(RegularProfile);    
}

return View(result);

使用object您必须检查并转换(强制转换)类型以从对象读取所有属性或调用方法。按照OOPOriented Object Programming的缩写),您可以使用抽象类型将所需的所有comom属性/方法保存到单个类型中。执行这样的操作,您可以将列表的结果转换为此抽象类型,并在View上使用它以获得强类型视图。样本:

让我们知道你有这个问题:

public class Profile 
{
   public int Id { get; set; }
   public string Name { get; set; }
}

您可以拥有与其联系或转换为它的类。

另一个选项可能是强制查询以返回此类型。

var result = new List<Profile>();

using (AppDbContext ctx = new AppDbContext())
{
    var rolesForUser = userManager.GetRoles(UserId);
    if(rolesForUser.Count() <= 0)
    {
        return View("SetupNewProfile");
    }


    var bandProfile = ctx.BandProfiles.Where(u => u.UserId == UserId)
                                      .Select(x => new Profile() { Id = x.Id, Name = x.Name})
                                      .ToList();


    var musicanProfile = ctx.MusicanProfiles.Where(u => u.UserId == UserId)
                                      .Select(x => new Profile() { Id = x.Id, Name = x.Name})
                                      .ToList();


    var regularProfile = ctx.RegularProfile.Where(u => u.UserId == UserId)
                                      .Select(x => new Profile() { Id = x.Id, Name = x.Name})
                                      .ToList();


    result.AddRange(BandProfile);
    result.AddRange(MusicanProfile);
    result.AddRange(RegularProfile);    
}

return View(result);

答案 1 :(得分:0)

这可以通过创建一个包含所有三个实体共有的属性的新类来完成。然后,您可以选择实体到新类的投影。

如果您的新课程如下:

public class Profile
{
  public int Id {get;set;}
  public string Name {get;set;}
}

然后您可以这样选择:

BandProfile = ctx.BandProfiles.Where(u => u.UserId == UserId).Select(x => new Profile(){Id = x.Id, Name = x.Name}).ToList();

MusicanProfile = ctx.MusicanProfiles.Where(u => u.UserId == UserId).Select(x => new Profile(){Id = x.Id, Name = x.Name}).ToList();

RegularProfile = ctx.RegularProfiles.Where(u => u.UserId == UserId).Select(x => new Profile(){Id = x.Id, Name = x.Name}).ToList();

然后,您应该能够将这3个集合合并到一个列表中,并在视图中返回它。这还有一个额外的好处,就是不会向客户端返回比预期更多的数据,因为只会返回显式添加到Profile类的属性。