返回具有不同模型类型的列表或数组
本文关键字:列表 数组 类型 模型 返回 | 更新日期: 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合并到数组或列表中并将其返回到视图中,但我不知道该怎么做。
如何将不同的类/模型类型合并到一个数组/列表中?
如果你有这些类型的抽象,你可以返回这个抽象的列表。它可以是所有类型继承的interface
或abstract 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
您必须检查并转换(强制转换)类型以从对象读取所有属性或调用方法。按照OOP
(Oriented 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 类的属性。