【发布时间】:2021-08-30 09:46:28
【问题描述】:
我有一个自定义且有些复杂的 SQL 查询,需要通过 EF Core DbContext 执行。
我意识到下面的示例代码可以使用简单的 .Select() 来解决,但不幸的是,我的实际表格是通过魔术键连接的,没有导航属性。 ????
无论如何我可以在不通过导航属性选择的情况下实现以下目标?
namespace ClassLibrary1
{
public class MyService
{
private readonly MyContext _context;
public void MyMethod()
{
var mySql = @"SELECT Foo.FooName, Bar.BarValue FROM Foo JOIN Bar ON Foo.Key = Bar.Key";
List<Dto> dtoList = _context.Database.MethodImLookingFor<Dto>(mySql); // Any ideas?
}
}
public class MyContext : DbContext
{
public DbSet<Foo> Foo { get; set; }
public DbSet<Bar> Bar { get; set; }
}
// My models are only records for brevity.
public record Foo(string Key, string FooName);
public record Bar(string Key, string BarValue);
public record Dto(string FooName, string BarValue);
}
实际的 SQL 查询:
SELECT R.Id, S.Code, V.Code
FROM dbo.Results R
JOIN dbo.Variable V ON V.Code = R.Value
JOIN dbo.Severity S ON S.Id = V.SeverityId
WHERE R.Type = N'Type' AND S.Code = 'ABC' OR S.Code = 'CBA' AND R.Id = '123'
我已经通过microsoft docs。如果不通过导航属性,这些都不会映射到自定义 DTO。
【问题讨论】:
-
老实说,我不会说带有单个连接的查询是“复杂的”;我们还缺少另一个查询吗?
-
我知道。实际的查询是完全不同的。我会在一分钟内发布旧的。
-
MethodImLookingFor<Dto>是here。 -
@RobertHarvey 来自 microsoft 的示例返回 Dbset 的模型以及包含返回的其他表。我没有那些导航道具,只需要初始 DbSet 中的一个列。
-
@BjørnNørgaard
returns the model of the Dbset<>不,DbSet 不是 模型。这些示例不直接返回任何数据。FromSqlRaw或FromSqlInterpolated返回一个可以过滤的IQueryable<T>。没有什么能阻止您在FromSqlRaw.BTW 之后添加.Select(x=>new{x.Id, x.SCode,x.VCode}),这就是您在 EF Core 中查询函数的方式
标签: c# sql-server entity-framework .net-core entity-framework-core