簡體   English   中英

如何在一個控制器/JOIN 中從我的數據庫返回/獲取兩個模型/表或使用存儲過程

[英]How to return / GET two models/tables from my DB in one controller / JOIN or use stored procedure

我正在嘗試創建獲取請求,當提供代理 ID 時,它會返回代理表中的所有代理信息和應用程序表中的所有代理應用程序。 這兩個表通過代理 ID 連接。

我嘗試了在 stakoverflow 上找到的一些方法,但一直遇到錯誤。

public class BrokerApplications
    {
        public virtual ICollection<Broker> Broker { get; set; }
        public virtual ICollection<Application> Applications { get; set; }
    }

    

我試過

[HttpGet("{id}")]
        public async Task<ActionResult<BrokerApplications>> GetBrokerApplicationsAsync(int brokerID)
        {
                var brokerApps = (from b in _context.Broker
                                  join a in _context.Application on b.BrokerId equals a.BrokerId
                                  where a.BrokerId == brokerID
                                  //            select new { b.BrokerForename, b.BrokerId, a.RollNumber, a.CustomerFullName }
                                  //).ToList();
                                  select a);
    
                return brokerApps;
}

但是收到一條錯誤消息說

“cs0029:不能將類型 'System.Linq.IQueryable<SMWEBAPI.Models.Application> 隱式轉換為 'Microsoft.AspNetCore.Mvc.ActionResult<SMWebAPI.Controllers.BrokerAppsController.BrokerApplicattions>

這是我嘗試的時候

[HttpGet("{id}")] public async Task<ActionResult> GetBrokerApplicationsAsync(int brokerID) { var broker = await _context.Broker.FindAsync(brokerID);

            BrokerApplications BrokerApps = new BrokerApplications();

            List<Application> lstApps = new List<Application>();
            lstApps = (List<Application>)_context.Application.Where(a => a.BrokerId == brokerID);
            BrokerApps.Broker = (ICollection<Broker>)broker.ToList();
            BrokerApps.Applications = lstApps;

            return BrokerApps;

}

但是當我嘗試從 URL 調用時會返回以下錯誤消息

InvalidCastException:無法將“Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 1[SMWebAPI.Models.Application]' to type 'System.Collections.Generic.List對象轉換1[SMWebAPI.Models.Application]' to type 'System.Collections.Generic.List 1[SMWebAPI.Models.Application]”。 BrokerAppsController.cs 中的 SMWebAPI.Controllers.BrokerAppsController.GetBrokerApplications(int brokerID) + lstApps = (List)_context.Application.Where(a => a.BrokerId == brokerID);

當提供brokerID時,有人可以幫助我如何從這個Get方法返回嗎?


更新

到目前為止,我還無法返回數據,因為當我使用一種沒有給我任何錯誤的方法時,它返回了一個空數組。

[HttpGet("{id}")]
    public async Task<ActionResult<BrokerApplications>> GetBrokerApplicationsAsync(int brokerID)
    {
        return new BrokerApplications()
        {
            Broker = await _context.Broker.Where(x => x.BrokerId == brokerID).ToListAsync(),
            Applications = await _context.Application.Where(a => a.BrokerId == brokerID).ToListAsync()
        };
    }

所以...

我想找到另一種獲取數據的方法。

我創建了一個存儲過程

    -- =======================================================
-- Create Stored Procedure Template for Azure SQL Database
-- =======================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author, , Name>
-- Create Date: <Create Date, , >
-- Description: <Description, , >
-- =============================================
CREATE PROCEDURE ApplicationsByBroker
(
    -- Add the parameters for the stored procedure here
    @brokerId int
)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON

    -- Insert statements for procedure here
    SELECT dbo.Application.*, dbo.Broker.*
  FROM dbo.Application, dbo.Broker
WHERE (dbo.Broker.BrokerID = @brokerId AND dbo.Application.BrokerID = 
    @brokerId)

    END
    GO

我運行它以確保它使用

USE SecuredMessagingDatabase;  
GO  
EXEC dbo.ApplicationsByBroker @BrokerId = 1000001;

我得到了預期的結果,我將如何在我的 web api 中執行它?

如果兩個對象通過BorkerId有關系,最好使用Include ,但您可以這樣寫來解決問題:

[HttpGet("{id}")]
public async Task<ActionResult<BrokerApplications>> GetBrokerApplicationsAsync(int brokerID)
{
   return new BrokerApplications()
   {
    Broker = await _context.Broker.Where(x=>x.Id==brokerID).ToListAsync(),
    Applications = await _context.Application.Where(a => a.BrokerId == brokerID).ToListAsync()
   };

  
}

試試下面的查詢,它有一次到數據庫的往返。 我希望EF不會失敗。

class BrokerApplication
{
   public Broker Broker {get; set;)
   public Application Application {get; set;)
}

[HttpGet("{id}")]
public async Task<ActionResult<BrokerApplications>> GetBrokerApplicationsAsync(int brokerID)
{
   var brokers = _context.Broker.Where(x => x.Id == brokerID)
      .Select(b => new BrokerApplication { Broker = b });

   var applications = _context.Application.Where(a => a.BrokerId == brokerID) 
      .Select(a => new BrokerApplication { Application = a });

   var combined = await brokers.Concat(applications).ToListAsync();

   var result = BrokerApplications
   {
     Broker = combined.Where(c => c.Broker != null)
       .Select(c => c.Broker).ToList(),
     Applications = combined.Where(c => c.Application != null)
       .Select(c => c.Application).ToList()
   };
 
   return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM