我有以下代码:
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合并到一个数组或列表中并将其返回到视图中,但我不知道该怎么做。
如何将不同的类/模型类型合并到一个数组/列表中?
答案 0 :(得分:3)
如果您对这些类型有抽象,则可以返回此抽象的列表。它可以是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属性/方法保存到单个类型中。执行这样的操作,您可以将列表的结果转换为此抽象类型,并在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类的属性。