C# 实体框架下利用原始SQL查询获取复杂对象

C# 实体框架下利用原始SQL查询获取复杂对象,c#,sql-server-2012,entity-framework-4.3,C#,Sql Server 2012,Entity Framework 4.3,我想使用单个查询从数据库中获取复杂对象。让我们看一下以下示例: 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

我想使用单个查询从数据库中获取复杂对象。让我们看一下以下示例:

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(\\example\u query).ToList();
请注意:

  • 我不应该在SELECT语句中手动列出列。TableA和TableB类以及SQL表可能会随着时间的推移而变化,但这些变化是一致的
  • 三个查询(一个用于从TableA和TableB获取ID,第二个用于从TableA获取对象,第三个用于从TableB获取对象)会影响性能,如果可能,我应该尽量避免
我正在使用Entity Framework 4.3和SQL Server 2012

谢谢,
Art

您仍然可以使用常规EF构造,只需将类映射到相应的表,并强制LINQ中的连接到实体:

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。

这里的
B_Id
是实际的外键吗?如果是这样的话,是否有原因不在
表a
中引用
表B
,这样就可以通过EF加载它,而不是使用原始SQL?不,不是,我只是将其添加到示例中以使用联接。很抱歉给你带来了困惑。在实际问题中,表a和表B之间没有关系,也没有选择用常规EF结构替换代码。使用EF4.x有什么原因吗?考虑升级到6.x吗?另外,您是否有权在DB中创建存储过程以执行复杂的连接?您的sql不应该是:从TableA.B_Id=TableB.Id上的TableA内部连接TableB中选择TableA.*,TableB.*
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});
}