【发布时间】:2020-04-10 09:16:51
【问题描述】:
这就是交易 - 我目前正在使用 EF Core 3.1,假设我有一个实体:
public class Entity
{
public int Id { get; set; }
public int AnotherEntityId { get; set; }
public virtual AnotherEntity AnotherEntity { get; set; }
}
当我以正常方式访问DbSet<Entity> Entities 时,我包含了另一个实体,例如:
_context.Entities.Include(e => e.AnotherEntity)
这行得通。为什么不呢,对吧?然后我去:
_context.Entities.FromSqlRaw("SELECT * FROM Entities").Include(e => e.AnotherEntity)
这也有效。两者都返回我与AnotherEntity 连接的相同对象集合。然后我使用一个存储过程,它包含相同的查询SELECT * FROM Entities,名为 spGetEntities:
_context.Entities.FromSqlRaw("spGetEntities")
你猜怎么着?这也有效。显然,它给了我相同的输出,但没有加入另一个实体。但是,如果我尝试像这样添加包含:
_context.Entities.FromSqlRaw("spGetEntities").Include(e => e.AnotherEntity)
我得到:
FromSqlRaw 或 FromSqlInterpolated 是使用不可组合的 SQL 调用的 并带有一个查询。考虑拨打
AsEnumerable在 FromSqlRaw 或 FromSqlInterpolated 方法之后执行 客户端组合。
即使_context.Entities.FromSqlRaw("SELECT * FROM Entities") 和_context.Entities.FromSqlRaw("spGetEntities") 的输出相同。
我找不到证据证明我可以或不能使用 EF Core 3.1 做到这一点,但如果有人能给我任何暗示这种方法的可能性,那就太好了。
此外,如果有另一种方法可以使用存储过程获得加入的实体,我可能会接受它作为我的问题的解决方案。
【问题讨论】:
-
这不是 EF 做不到的。它是 SQL 本身(“不可组合的 SQL”),所以更不用说 EF 了。
-
@GertArnold 请将其添加为答案。它也会帮助其他用户。
-
_context.Something.FromSqlRaw("EXECUTE dbo.spCreateSomething @Id, @Year", sqlParameters).IgnoreQueryFilters().AsNoTracking().AsEnumerable().FirstOrDefault();这对我有用,你可以使用 ToList() 以及 .AsEnumerable().FirstOrDefault() 来获得很多。
标签: c# .net entity-framework join entity-framework-core