我有一个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一起加入。但这也不适合我。
答案 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,
};
不幸的是,这会将双方的整个结果集拉入内存,然后评估连接。您可能需要调整代码。