通过Entity Framework中的原始SQL查询获取复杂对象

Art*_*ski 6 c# sql-server-2012 entity-framework-4.3

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

SELECT TableA.*, TableB.*
FROM TableA
INNER JOIN TableA.B_Id = TableB.Id
Run Code Online (Sandbox Code Playgroud)

和相应的类:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

var results = ctx.Database.SqlQuery<QueryResult>(\\example_query).ToList();
Run Code Online (Sandbox Code Playgroud)

注意:

  • 我不应该在SELECT语句中手动列出列.TableA和TableB类以及SQL表可能会随时间而变化,但这些更改将保持一致.
  • 三个查询(一个用于从TableA和TableB获取ID,第二个用于从TableA获取对象,第三个用于从TableB获取对象)将损害性能,如果可能,我应该尝试避免它.

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

谢谢,艺术

Die*_*ego 0

您仍然可以使用常规 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});
}
Run Code Online (Sandbox Code Playgroud)

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