[英]How to query data from multiple tables in EF?
這是我的查詢,用於從 SQL 服務器的多個表中獲取數據
SELECT
Blob.transactionId,
Blob.status,
COUNT(Bsp._id) AS processed,
Blob.total,
Blob.reason,
(SELECT MAX(MyMaxName)
FROM (VALUES
(MAX(Fail.ProcessTime)),
(MAX(Bsp.ProcessTime))
) MyAlias(MyMaxName)) AS ProcessTime ,
COUNT(DISTINCT Fail.id) AS failed
FROM
BlobStatus AS Blob
LEFT JOIN
BspResponse AS Bsp ON Bsp.tid = Blob.transactionId
LEFT JOIN
FailedResponse AS Fail ON Fail.transactionId = Blob.transactionId
WHERE
Blob.transactionId = "084f4b75-c38e-449c-a9eb-148dce67111a"
GROUP BY
Blob.transactionId, Blob.status, Blob.total, Blob.reason, Blob.failed
在 .NET 代碼中,我通過調用下面提到的方法來嘗試這種方式。 通過參考本教程https://www.entityframeworktutorial.net/Querying-with-EDM.aspx 。 實體 SQL
public BlobResponse GetBlobDetailsById(string tid)
{
try
{
string sqlQuery = $"SELECT " +
" Blob.transactionId, Blob.status, " +
"COUNT(Bsp._id) AS processed, Blob.total, " +
" Blob.reason, " +
"(SELECT" +
" MAX(MyMaxName) " +
"FROM(VALUES " +
$"(MAX(Fail.ProcessTime))," +
$" (MAX(Bsp.ProcessTime)) ) " +
"MyAlias(MyMaxName)" +
") as ProcessTime, " +
"COUNT(DISTINCT Fail.id) AS failed " +
"FROM BlobStatus AS Blob " +
"LEFT JOIN BspResponse AS Bsp ON Bsp.tid = Blob.transactionId " +
"LEFT JOIN FailedResponse AS Fail ON Fail.transactionId = Blob.transactionId " +
$"WHERE Blob.transactionId = {tid} " +
" GROUP BY Blob.transactionId, Blob.status, Blob.total, Blob.reason, Blob.failed";
var objctx = ((IObjectContextAdapter)_mriDbContext).ObjectContext;
ObjectQuery<BlobResponse> res = objctx.CreateQuery<BlobResponse>(sqlQuery);
BlobResponse blobResponse = res.First<BlobResponse>();
return blobResponse;
}
catch (Exception e)
{
_logger.LogInformation(e.Message);
return null;
}
}
我收到以下錯誤
[17:27:43 INF] 無法將類型為“Flash.MultiRecordInquiry.Subscriber.Models.Context.MriDbContext”的 object 轉換為類型“System.Data.Entity.Infrastructure.IObjectContextAdapter”。
這是數據庫上下文
public class MriDbContext : DbContext
{
public MriDbContext(DbContextOptions<MriDbContext> options) : base(options)
{ }
public DbSet<BSPReponse> BspResponse { get; set; }
public DbSet<BspStatusDetails> BspStatusDetails { get; set; }
public DbSet<FhaStatusDetails> FhaStatus { get; set; }
public DbSet<BlobStatus> BlobStatus { get; set; }
public DbSet<FailedResponse> FailedResponses { get; set; }
}
我是 EF 新手,不熟悉在實體框架中運行如此復雜的查詢。 請幫助我如何解決此問題
提前致謝
我希望它可能對其他人有所幫助,就像在看到其他人的許多建議和回復之后一樣。 我剛剛想通了,有一種改變的方式可以執行原始查詢,就像在 SQL 服務器中一樣。
例如,您可以通過在 EF 中這樣使用來執行原始查詢
using (var command = _ctx.Database.GetDbConnection().CreateCommand())
{
command.CommandText = "select * from MARK where tid ='123'";
_ctx.Database.OpenConnection();
using (var reader = command.ExecuteReader())
{
reader.Read();
var firstColumnObject = reader.GetValue(0);
}
_ctx.Database.CloseConnection();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.