沒有DbSet的原始SQL查詢 - 實體框架核心

c# entity-framework-core

使用Entity Framework Core刪除dbData.Database.SqlQuery<SomeModel>我找不到為我的全文搜索查詢構建原始SQL查詢的解決方案,該查詢將返回表數據和排名。

我見過在Entity Framework Core中構建原始SQL查詢的唯一方法是通過dbData.Product.FromSql("SQL SCRIPT");這沒用,因為我沒有DbSet會映射我在查詢中返回的排名。

有任何想法嗎???

一般承認的答案

如果您使用自2018年7月7日起可用的EF Core 2.1 Release Candidate 1,則可以利用建議的新功能,即查詢類型。

什麼是查詢類型

除了實體類型之外,EF Core模型還可以包含查詢類型,這些查詢類型可用於對未映射到實體類型的數據執行數據庫查詢。

何時使用查詢類型?

用作ad hoc FromSql()查詢的返回類型。

映射到數據庫視圖。

映射到未定義主鍵的表。

映射到模型中定義的查詢。

所以你不再需要做所有的黑客或解決方案作為你的問題的答案。只需按以下步驟操作:

首先,您定義了一個類型為DbQuery<T>的新屬性,其中T是將攜帶SQL查詢的列值的類的類型。所以在你的DbContext你會有這個:

public DbQuery<SomeModel> SomeModels { get; set; }

其次使用FromSql方法,就像使用DbSet<T>

var result = context.SomeModels.FromSql("SQL_SCRIPT").ToList();
var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();

另請注意,DBContexts是部分類 ,因此您可以創建一個或多個單獨的文件來組織最適合您的“原始SQL DbQuery”定義。


熱門答案

在EF Core中,您不再可以執行“免費”原始sql。您需要為該類定義POCO類和DbSet 。在您的情況下,您將需要定義Rank

var ranks = DbContext.Ranks
   .FromSql("SQL_SCRIPT OR STORED_PROCEDURE @p0,@p1,...etc", parameters)
   .AsNoTracking().ToList();

因為它肯定是只讀的。包含.AsNoTracking()調用將是有用的。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow