【问题标题】:Fetching complex objects by raw SQL query in Entity Framework通过实体框架中的原始 SQL 查询获取复杂对象
【发布时间】:2015-07-02 09:31:10
【问题描述】:

我想使用单个查询从数据库中获取复杂对象。我们看下面的例子:

SELECT TableA.*, TableB.*
FROM TableA
INNER JOIN TableA.B_Id = TableB.Id

及对应的类:

public class QueryResult
{
    public TableA A { get; set; }
    public TableB B { get; set; }
}

public class TableA
{
    public int Id { get; set; }
    public string SomeContentA { get; set; }
    public int B_Id { get; set; }
}

public class TableB
{
    public int Id { get; set; }
    public int SomeContentB { get; set; }
}

我想从上面对数据库执行原始 SQL 查询,并获取具有正确设置 A 和 B 属性的 QueryResult 对象的集合。到目前为止,我尝试使用 SqlQuery 方法,但我只设法在 A 和 B 属性中获取具有空值的 QueryResult 对象的集合(显然返回的结果集未正确绑定到属性):

var results = ctx.Database.SqlQuery<QueryResult>(\\example_query).ToList();

注意:

  • 我不应该在 SELECT 语句中手动列出列。 TableA 和 TableB 类以及 SQL 表可能会随着时间的推移而发生变化,但这些变化将是一致的。
  • 三个查询(一个从 TableA 和 TableB 获取 ID,第二个从 TableA 获取对象,第三个从 TableB 获取对象)会影响性能,我应该尽可能避免它。

我正在使用 Entity Framework 4.3 和 SQL Server 2012。

谢谢, 艺术

【问题讨论】:

  • B_Id 是这里的实际外键吗?如果是这样,是否有原因您没有在 TableA 中引用 TableB,因此您可以通过 EF 加载它,而不是使用原始 SQL?
  • 不,不是,我只是将它添加到示例中以使用连接。对困惑感到抱歉。在实际问题中,TableA 和 TableB 之间没有任何关系,并且没有选项可以用常规的 EF 构造替换代码。
  • 有使用 EF4.x 的理由吗?考虑升级到 6.x 吗?另外,您是否有权在数据库中创建一个 SProc 来执行复杂的连接?
  • 你的sql不应该是:SELECT TableA.*, TableB.* FROM TableA INNER JOIN TableB ON TableA.B_Id = TableB.Id

标签: c# sql-server-2012 entity-framework-4.3


【解决方案1】:

您仍然可以使用常规的 EF 构造,只需将您的类映射到其对应的表并在 LINQ-To-Entities 中强制连接:

using(var ctx = new MyDbContext())
{
    return ctx.TableA
         .Join(ctx.TableB, a=>a.B_Id, b=>b.Id, (a,b)=>
              new QueryResult{TableA=a, TableB=b});
}

我认为这是唯一的方法,至少到 EF6 为止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2023-03-20
    • 2016-05-20
    • 1970-01-01
    • 2015-06-16
    • 2015-04-25
    相关资源
    最近更新 更多