【问题标题】:SQL View Script for Entity Framework related entities实体框架相关实体的 SQL 视图脚本
【发布时间】:2015-04-22 22:19:59
【问题描述】:

我正在创建一个 SQL 视图,最终我想将该视图添加到我的实体框架模型中。我知道这可以简单地在 Entity Framework 中完成,但我只是在试验视图,需要提高我的 SQL 技能。

让我们想象一个场景,我从一个名为 Sates 的表中提取数据。 State 与另一个名为 City 的表有 0->n 关联。 City 与另一个名为 Streets 的表之间存在 0-n 关联。

所以我的脚本类似于:

SELECT st.Name, st.ID FROM Test.States s
LEFT OUTER JOIN Test.Cities c on c.StateID = s.ID
LEFT OUTER JOIN Test.Streets str on str.CityID = c.ID

我需要在视图脚本中添加什么来获取下面显示的层次结构中所有相应的城市和街道?我基本上希望我的 View 实体填充 Cities 和 Streets 集合:

public partial class StateView
{
    public string Name { get; set; }
    public long ID { get; set; }
    public ICollection<City> Cities { get; set; }
}

public partial class City
{
    public string Name { get; set; }
    public long ID { get; set; }
    public ICollection<Street> Streets { get; set; }
}

附:我的目标是去DB一趟,提前谢谢你!

【问题讨论】:

    标签: sql sql-server entity-framework entity-framework-6 sql-view


    【解决方案1】:

    您可以扩展视图以在结果中简单地包含其他字段,然后在代码中处理数据。

    create view TestView
    SELECT s.Name as sName, s.ID as sID, 
    c.ID as cID, c.Name as cName, 
    str.ID as strID, str.Name as strName  
    FROM Test.States s
    LEFT OUTER JOIN Test.Cities c on c.StateID = s.ID
    LEFT OUTER JOIN Test.Streets str on str.CityID = c.ID
    

    添加到 EF 模型后,根据需要进行处理...例如对于简化的 c# DataContext/LINQ 设置:

    YourDataContext dc = new YourDataContext();
    
    //Single call to DB here
    var newObj =
    (from p in dc.TestView
    group p by new { p.sID, p.sName } into g
    select new StateView
    {
        ID = g.sID,
        Name = g.sName,
        Cities = from pp in g.cID 
                 group pp by new { pp.cID, pp.cName } into gg
                 select new City
                 {
                      ID = gg.cID
                      Name = gg.cName,
                      Streets = gg.Streets.ToList()
    
                 }
    }).toList();
    

    请注意,此代码未经测试,可能需要调整。

    想法是在初始视图中包含所有数据,然后使用 LINQ 中的分组将视图处理为对象。在没有街道结构的情况下,我只是对它进行了列表()(需要修改街道结构)。结果对象应该是一个包含所有子属性的列表。

    【讨论】:

    • Streets 上的 ToList() 将是对每个城市的数据库的额外调用。这假设急切加载,在某些情况下,您需要延迟加载
    【解决方案2】:

    我的解决方案是通过 edmx 模型添加手动关联。

    请参考: Entity Framework - Add Navigation Property Manually 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多