[asp.net]返回列表或数组与不同的模型类型

发布时间: 2017/3/26 1:15:20
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有以下代码︰

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

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

解决方法 1:

如果你有这些类型的抽象,您可能会返回一个列表的这种抽象。它可能是 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 你必须检查并从对象转换 (cast) 要读取所有属性或调用方法的类型。请按照 OOP (简称 Oriented Object Programming ),你可以有一个抽象的类型来控制所有公共属性/方法你需要到单个类型。做这样的事情,你可以将你列表的结果转换成这种抽象类型和在视图上使用它有一个强类型的视图。示例︰

让我们要怎样你有此类︰

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

你能从它或将转换为它的类 iheriting。

另一种选择可以铸造你的查询以返回这种类型。

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);
官方微信
官方QQ群
31647020