【问题标题】:How to select data from entity framework without selecting its icollection(foreign table)如何从实体框架中选择数据而不选择其icollection(外表)
【发布时间】:2019-02-04 06:20:08
【问题描述】:

我正在使用 C# 从我的数据库中选择数据。现在我有两个表,第一个是 aspnetuser,第二个是 aspnetuserroles,当我执行以下查询时,aspnetuserroles 与 aspnetuser 表有外键链接

db.AspNetUsers.ToList()

aspnetroles 数据将出现在 aspnetusers 数据中。这将导致我的数据表无法显示其数据,因为数据表期望一列参数中有一个值。如果该 json 中的 aspnet 角色数据,它将显示为多行并且数据表不接受它。如果我删除该外键链接,我的数据表将显示没有任何错误。

在这种情况下,我想要的是如何在不拉出外部表的情况下选择 aspnetusers 表。例如

db.AspNetUsers.Select(x=>x.AspNetUsers).ToList();

【问题讨论】:

  • 你试过关闭延迟加载吗?
  • @JSantosh yeslazy loading false 解决问题,标记为答案

标签: c# model-view-controller datatable


【解决方案1】:

关闭延迟加载。这样孩子就不会被自动获取。

【讨论】:

    【解决方案2】:

    尝试做这样的事情(有利于保持返回对象光亮并留下任何不需要的列):

    (我刚刚编了一些 col 名称,但你明白了。)

    var result = (from a in db.AspNetUsers
                  select new AspNetUser { Name = a.Name, 
                               othercol1 = a.othercol1,
                               othercol2 = a.othercol2,
                               }).ToList();
    

    脚注:实际上,将实际的 db 实体返回到前端通常不是一个好习惯,因此您可能希望拥有自己的数据传输对象 (DTO)。

    【讨论】:

      【解决方案3】:

      您使用 Fluent API 的方法在映射中进行了配置

      • HasOptional
      • HasMany
      • Ignore

      等等。但通常,我在数据库中创建模式绑定视图,然后在 EF 中映射它。在我们只对没有所有关节的扁平化查询感兴趣的情况下,它的效果非常好。

      或者使用 Linq to EF 投影作为 JonhB 的答案...

      var result = (from a in db.AspNetUsers
                select new AspNetUser { Name = a.Name, 
                             ...
                             }).ToList();
      

      请确保您不要在 db.AspNetUsers 上调用 ToList,因为这会在 AspNetUsers 上实现查询,并且所有它都是外键引用,因此投影在查询返回后在内存中完成

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-12
        • 2022-02-15
        • 2018-12-19
        相关资源
        最近更新 更多