如何从两个不同的数据库对IQueryable <t>执行LINQ连接

时间:2016-05-19 19:37:38

标签: c# entity-framework linq asp.net-web-api odata

我有一个WebAPI方法,它使用OData查询选项将数据返回给客户端。该方法用于获取实体'WHTRatesMaster'记录。该实体将“国家”作为其中一个属性(实际上是国家代码,而不是名称)。国家/地区名称可以与另一个实体CountryCodes分开提供,该实体位于与WHTRatesMaster数据库不同的数据库中。为了返回国家/地区名称的新属性,我创建了一个名为“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一起加入。但这也不适合我。

1 个答案:

答案 0 :(得分:1)

您将把IQueryable结果更改为IList之类的内容。该联接不会在两个完全不相关的虚拟&#39;支持的对象之间工作。列表提供者。

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

不幸的是,这会将双方的整个结果集拉入内存,然后评估连接。您可能需要调整代码。