使用linq使用来自两个不同模型的数据填充模型

时间:2013-04-17 12:45:12

标签: c# asp.net-mvc linq

我已经导入了一个数据库,该数据库具有与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中不是很好,但感觉这很简单,当我不让它工作时会让它变得非常令人沮丧。

任何输入都是适用的。

3 个答案:

答案 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()
                        };