EF中如何查询多个表的数据?
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] Unable to cast object of type 'Flash.MultiRecordInquiry.Subscriber.Models.Context.MriDbContext' to type '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 的新手,不熟悉 运行 Entity Framework 中的此类复杂查询。
请帮我解决这个问题
提前致谢
我希望它能对其他人有所帮助,在看到其他人的许多建议和回复后喜欢。我刚刚弄明白了,有一种改变的方式,您可以像在 SQL server.
中那样执行原始查询
例如,您可以在 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();
}
这是我的查询,用于从 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] Unable to cast object of type 'Flash.MultiRecordInquiry.Subscriber.Models.Context.MriDbContext' to type '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 的新手,不熟悉 运行 Entity Framework 中的此类复杂查询。 请帮我解决这个问题
提前致谢
我希望它能对其他人有所帮助,在看到其他人的许多建议和回复后喜欢。我刚刚弄明白了,有一种改变的方式,您可以像在 SQL server.
中那样执行原始查询例如,您可以在 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();
}