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

本文关键字:列表 数组 类型 模型 返回 | 更新日期: 2023-09-27 18:31:47

我有以下代码:

        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合并到数组或列表中并将其返回到视图中,但我不知道该怎么做。

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

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

如果你有这些类型的抽象,你可以返回这个抽象的列表。它可以是所有类型继承的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属性/方法到一个类型中。执行此类操作,可以将列表的结果转换为此抽象类型,并在视图上使用它以获得强类型视图。对于示例:

让我们假设你有这个类:

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

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

如果新类如下所示:

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 类的属性。