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

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

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_query).ToList(); 

注意:

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

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

谢谢,艺术

您仍然可以通过将类映射到相应的表并强制LINQ-To-Entities中的连接来使用常规EF构造:

 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。