【发布时间】:2020-03-09 02:38:13
【问题描述】:
我正在使用 dotnet core 2.x 应用程序。
我们有一堆“代码优先”实体,在 DBContext 中每个实体都有一个 DBSet。
示例:
public class MyContext : DBContext
{
public MyContext(DBContextOptions<MyContext> options) : base (options) {}
public DbSet<Models.MyTable> MyTable { get; set; }
...
到目前为止,一切都很好。现在我想做这个查询:
SELECT DISTINCT MyColumn from dbo.MyTable
应该很容易吧? “经典 EF”有 dbData.Database.SqlQuery<SomeModel>,但在 EF Core 2.x 中,我应该能够执行以下操作:
var myList = _context.MyTable.FromSql("SELECT DISTINCT MyColumn from dbo.MyTable").ToList();
这失败了:
错误 CS1061:DbSet 不包含 FromSql 的定义...
我读到我可能需要安装一个额外的包“Microsoft.EntityFrameworkCore.Relational”。但是 NuGet > Browse 只向我展示了 v3.1(没有 2.x 版本)......并且安装这个包想要引入许多其他依赖项(!)
问题:
有什么方法可以使用 EF Core 2.x 进行简单的 SQL 查询...
...不需要“select *”(带入整个表格!)并且不需要下载和安装一堆额外的 NuGet依赖?
【问题讨论】:
-
嗯,没有等效的 EF6
SqlQuery<T>。FromSql需要定义包含返回列的查询类型。有2.x Relational package,比如2.2.6。 -
但是对于这样的简单查询,您不需要原始 SQL,LINQ 就足够了,
var myList = _context.MyTable.Select(e => e.MyColumn).Distinct().ToList();将生成并执行完全相同的 SQL,而无需额外的包/类型。 -
@Ivan Stoev:1)我后来在 NuGet 网页上找到了 2.2.x 关系包(我不知道为什么“NuGet Browse”没有显示它们)。我很高兴没有“一百万个依赖项”。 2)关于 FromSql 需要定义的查询类型是正确的:我遇到了这个问题,但还没有弄清楚如何最好地处理它。 3)我会试试LINQ。听起来不错的建议 - 谢谢!