【问题标题】:create appropriate model with linq and entity framework使用 linq 和实体框架创建适当的模型
【发布时间】:2015-04-27 12:30:19
【问题描述】:

我对@9​​87654322@ 很陌生,我无法得到我需要的东西。 最后我需要以下模型:

public class MyModel {
     ... a quite long list of properties ...
     public List<SubModel> Submodels {get;set;}
}

MyModel 包含一个子模型元素列表,每个模型大约有 50 个子模型。

为了得到这个,我正在写这个查询:

using (var db = new MyDataContext())
{
    var query = db.MyModels.As Queryable().Where(x => x.RevId == revId);
    var res = query.Join(db.MySubModels,
              pb => new { pb.Key, pb.RevId},
                f => new { f.Key, f.RevId}
              (pb, f) => new { MyModel = pb, Submodel = f });            
}

上面给了我匿名类型,其中每个元素都有 MyModel 和 Submodel,但这不是我需要的。 由此我需要以某种方式获得如上所述的结构。我认为我应该以某种方式对数据或其他内容进行分组。

编辑 我需要这个,因为稍后我必须添加

a) MyModel 的一个属性,它将对“MySubModels 列表中的第一个元素”进行一些计算

b) MyModel 的另一个属性,它将对“MySubModels 列表中的第三个元素”进行一些计算

等等

附:我不能使用导航属性,因为加入是使用两列值(键和 RevId)完成的。它们在实体“MyModel”和“MySubModel”中都不是唯一的,但 Key + RevId 的组合将是唯一的。

【问题讨论】:

  • 如果您有外键关系,则应该有包含您需要的数据的导航属性...查找 .Include() 用于 linq 到实体的扩展...msdn.microsoft.com/en-us/library/bb738708(v=vs.110).aspx
  • tbh 如果您有许多 myModel,您当前的结果可能是最好的解决方案,因为您可以避免多次查询。忽略多余的数据
  • 我已经修改了一个代码,所以现在连接是使用两列完成的。这是错误。

标签: c# linq entity-framework


【解决方案1】:
using (var db = new MyDataContext())
{
    var query = db.MyModels.As Queryable().Where(x => x.RevId == revId);
    var res = query
                .Join(db.MySubModels, pb => new { pb.Key, pb.RevId}, f => new { f.Key, f.RevId}, (pb, f) => new { MyModel = pb, Submodel = f })
                .AsEnumerable() //get the data and map objects
                .GroupBy(x => x.MyModel) //group them
                .Select(group => new { MyModel = group.Key, Submodels = group.Select(x => x.Submodel).ToList() });            
}

【讨论】:

  • 我没有导航属性。基本上是因为我需要使用两列加入。密钥不是唯一的。我必须使用“RevId + Key”加入。
  • 我已经修改了一个代码,所以现在连接是使用两列完成的。这是错误。
  • @renathy 好的,现在我这边的情况正在清理...这是否解决了您这边的问题?如果是这样,只需回答您自己的问题并接受它(或删除问题......您的电话)
  • 不,它不能修复。它只是显示我现在所拥有的。但我需要另一个结构。现在的结果是一些包含模型和子模型的匿名类型,我需要模型和子模型列表。稍后我需要采用“第一个”子模型、“第三个”子模型和其他一些子模型。
  • @renathy 所以你需要的只是一个分组?更改了答案以匹配...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2011-08-29
  • 2011-09-08
  • 2016-03-26
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多