我已经导入了一个数据库,该数据库具有与Subdata的一对多关系的集合MainData,生成的代码看起来像这样;
public DbSet<MainData> MainDatas{ get; set; }
public partial class MainData
{
public string NameOfMainData{ get; set; }
public virtual ICollection<SubData> SubDataSet{ get; set; }
}
SubData只有一些非复杂的数据类型,如字符串和整数。
我可以将数据导入视图,因此我知道该部分有效。我想将它合并到一个模型中,这样我就可以在同一个模型中使用“NameOfMainData和一个SubData集合,以便在视图中轻松实现,但我不能让它工作,这是我的尝试;
模型;
public class DataIWantInAList
{
public IList<DataIWant> DataList { get; set; }
}
public class DataIWant
{
public string NameOfMainData{ get; set; }
public IEnumerable<SubData> SubDataSet{ get; set; }
}
在Controller中,我认为我可以在DataList中添加项目,但我没有设法在互联网上找到任何东西或为我自己解决这个问题......而且这个;
var DataToView= from p in db.MainData
select new DataIWant()
{
NameOfMainData= p.NameOfMainData,
SubDataSet= p.SubDataSet
};
return View(DataToView);
不要像预期的那样工作。我在LINQ中不是很好,但感觉这很简单,当我不让它工作时会让它变得非常令人沮丧。
任何输入都是适用的。
答案 0 :(得分:1)
<强>声明强>
- 数据提取是在你使用EntityFramework的假设下进行的,因为我不仅仅是LINQ中最适合的:(请随意调整它)
- 这只是众多方式中的一种。在将模型提供给视图时尝试进行实验
- params应该是“过滤器”的基本占位符
- 您可以以任何您喜欢的方式扩展映射,只需确保在视图中正确引用,否则您将遇到运行时错误
在模型中你可以做这样的事情(即使我将实体获取移动到私有函数。在你的类DataIWant中你只需指定你想要的数据。如果你想专门映射,那么就这样做启动您的DataIWantInAList
public class DataIWantInAList
{
public IList<DataIWant> data;
//Instanciation & Initialization
public DataIWantInAList(params customparam)
{
using(EntitySet ent = new EntitySet())
{
//fetch data from DB
this.data = (from x in ent.DataTableIWant where param == customparam select x).ToList();
}
}
}
在您的控制器中,您可能想要去:
public ActionResult fooBar()
{
DataIWantInAList model = new DataIWantInAList(params);
return View(model);
}
虽然您可以通过以下方式获取视图中的数据:
var List = model.data;
答案 1 :(得分:0)
假设我理解你的问题,你可以使用.Include(...)来获取你想要的数据。
var DataToView = from p in db.MainData
select new DataIWant()
{
NameOfMainData= p.NameOfMainData.Include(p => p.SubDataSet)
}
答案 2 :(得分:0)
您可以使用Include
加载相关实体,然后将它们映射到您的模型类型:
var DataToView= from p in db.MainData
.Include("ItemTypeReference")
select new DataIWant()
{
NameOfMainData= p.NameOfMainData,
SubDataSet= p.SubDataSet
.Select(s => new SubData {
// map SubData fields here
})
.ToList()
};