C# 如何在EF中查询多个表中的数据?
这是我的查询,用于从SQLServer的多个表中获取数据C# 如何在EF中查询多个表中的数据?,c#,entity-framework,.net-core,entity-sql,C#,Entity Framework,.net Core,Entity Sql,这是我的查询,用于从SQLServer的多个表中获取数据 SELECT Blob.transactionId, Blob.status, COUNT(Bsp._id) AS processed, Blob.total, Blob.reason, (SELECT MAX(MyMaxName) FROM (VALUES (MAX(Fail.ProcessTime)), (MA
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代码中,我通过调用下面提到的方法尝试了这种方法。通过参考本教程
. 实体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”类型的对象强制转换为“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 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 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();
}
我建议只搜索LINQ google EF LINQ,你会看到很多示例。@AliK该查询复杂且嵌套选定,我不确定如何在LINQ中编写。你可以这样运行查询。我建议只搜索LINQ google EF LINQ,你会看到很多示例。@AliK该查询复杂且嵌套选定,而我不是确定如何在linq中编写。您可以像这样运行查询