简体   繁体   English

如何从 EF 中的多个表中查询数据?

[英]How to query data from multiple tables in EF?

This the query I have which is used to get data from multiple tables from SQL server这是我的查询,用于从 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

In .NET code, I tried in this way by calling the below-mentioned method.在 .NET 代码中,我通过调用下面提到的方法来尝试这种方式。 By referring to this tutorial https://www.entityframeworktutorial.net/Querying-with-EDM.aspx .通过参考本教程https://www.entityframeworktutorial.net/Querying-with-EDM.aspx Entity SQL实体 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;
        }
    }

I am getting the following error我收到以下错误

[17:27:43 INF] Unable to cast object of type 'Flash.MultiRecordInquiry.Subscriber.Models.Context.MriDbContext' to type 'System.Data.Entity.Infrastructure.IObjectContextAdapter'. [17:27:43 INF] 无法将类型为“Flash.MultiRecordInquiry.Subscriber.Models.Context.MriDbContext”的 object 转换为类型“System.Data.Entity.Infrastructure.IObjectContextAdapter”。

This is the DB context这是数据库上下文

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; }
}

I am new to EF and not familiar to run such complex queries in Entity Framework.我是 EF 新手,不熟悉在实体框架中运行如此复杂的查询。 Please help me how to resolve this issue请帮助我如何解决此问题

Thanks in advance提前致谢

I hope it might help full to others, Like after seeing many suggestions and replies from others.我希望它可能对其他人有所帮助,就像在看到其他人的许多建议和回复之后一样。 I just figured it out, there is an altered way where you can execute the raw query as in SQL server.我刚刚想通了,有一种改变的方式可以执行原始查询,就像在 SQL 服务器中一样。

For example, you can execute the raw query by using like this in EF例如,您可以通过在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM