簡體   English   中英

如何在IQueryable上執行LINQ連接 <T> 來自兩個不同的數據庫

[英]How to perform a LINQ join on IQueryable<T> from two different database

我有一個WebAPI方法,該方法使用OData查詢選項將數據返回給客戶端。 該方法用於獲取實體“ WHTRatesMaster”記錄。 該實體的屬性之一是“國家/地區”(實際上是國家/地區代碼,而不是名稱)。 國家名稱可以與另一個實體CountryCodes分開獲得,后者位於與WHTRatesMaster DB不同的數據庫中。 為了返回國家名稱的新屬性,我創建了一個名為“ WHTRatesMasterDTO”的新類。 下面是我的代碼:

public class WHTRatesMaster
{
    public string Country { get; set; }
}

public class WHTRatesMasterDTO
{
    public string CountryName { get; set; }
    public string CountryIsoCode { get; set; }
}

public class CountryCodes
{
    public string Iso3CountryCode { get; set; }
    public string Country { get; set; }
}

[HttpGet]
[Route("api/WHTRatesMaster")]
public PageResult<WHTRatesMasterDTO> GetWHTRatesMasterDbSet(ODataQueryOptions options)
{
    var whtRatesDTOList = from whtRatesItem in aqrOperationsDbCtx.WHTRatesMasterDbSet
                         join country in secMasterDbCtx.CountryCodesDbSet on whtRatesItem.Country equals country.Iso3CountryCode
                         select new WHTRatesMasterDTO()
                         {
                             CountryName = whtRatesItem.Country,
                             CountryIsoCode = country.Country,
                         };

            var whtRatesMasterPageData = options.ApplyTo(whtRatesDTOList) as IQueryable<WHTRatesMaster>;

            var odataProperties = Request.ODataProperties();

            return new PageResult<WHTRatesMasterDTO>(whtRatesDTOList, odataProperties.NextLink, odataProperties.TotalCount);
}

當我執行上述代碼時,我收到以下異常消息:“ 指定的LINQ表達式包含對與不同上下文關聯的查詢的引用。

在找到解決問題的方法時,我能得到一些幫助嗎?

更新:我還試圖在內存中獲取國家列表,然后將其與IQueryable一起加入。 但這對我也不起作用。

您將把IQueryable結果更改為IList之類的內容。 該聯接不適用於由兩個完全不相關的“虛擬”列表提供程序支持的對象。

var whtRatesDTOList = from whtRatesItem in aqrOperationsDbCtx.WHTRatesMasterDbSet.ToList()
                     join country in secMasterDbCtx.CountryCodesDbSet.ToList() on whtRatesItem.Country equals country.Iso3CountryCode
                     select new WHTRatesMasterDTO()
                     {
                         CountryName = whtRatesItem.Country,
                         CountryIsoCode = country.Iso3CountryCode,
                         };

不幸的是,這會將整個結果集從兩端拉入內存,然后評估連接。 您可能需要調整代碼。

暫無
暫無

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

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