Asp.net core IQueryable,其中包含一个列表抛出;找不到CLR类型';列表<;字符串>'&引用;
在使用IBM.EntityFrameworkCore和IBM.Data.DB2.Core时,每当我有一个Asp.net core IQueryable,其中包含一个列表抛出;找不到CLR类型';列表<;字符串>'&引用;,asp.net-core,db2,entity-framework-core,Asp.net Core,Db2,Entity Framework Core,在使用IBM.EntityFrameworkCore和IBM.Data.DB2.Core时,每当我有一个Where语句,其中包含一个正在执行某种验证的列表时,就会抛出一个错误 当IQueryable正在具体化时,即使用ToList()转换为列表时,会引发错误 找不到CLR类型到关系类型的映射 “名单” 专用IQueryable筛选器Advisor的活动(IQueryable活动列表,列表advisorCodes) { ListadvisorInformation=GetAdvisorCastom
Where
语句,其中包含一个正在执行某种验证的列表时,就会抛出一个错误
当IQueryable正在具体化时,即使用ToList()
转换为列表时,会引发错误
找不到CLR类型到关系类型的映射
“名单”
专用IQueryable筛选器Advisor的活动(IQueryable活动列表,列表advisorCodes)
{
ListadvisorInformation=GetAdvisorCastomers(advisorCodes)。结果;
var advisorCustomers=advisorInformation.SelectMany(a=>a.Customers)
.Distinct()
.ToList();
//这是有问题的地方
activitiesList=activitiesList.Where(a=>advisorcstomers.Any(ac=>ac==a.CustomerId));
返回活动列表;
}
公共类广告
{
公共字符串AdvisorCode{get;set;}
公共列表客户{get;set;}
}
错误可能是什么,因为AFAIK,使用列表的条件不仅应该由LINQtoEntities支持,而且应该由LINQtoSQL支持
DB2实体框架库是否可能不支持,即不将这些条件转换为SQL?
有人能证实吗
我的主要要求是保持IQueryable,以便对数据库执行查询。是否可以使用其他内容重写查询?DB2 EF核心库(目前)确实不支持使用
.Any()
或.Contains()
。但是,可以通过编写一个自定义表达式来“重写”此行为,该表达式模仿SQLWHERE
函数,并在查询中使用多个条件
基本上,您传递要迭代的列表,并使用
Expression.OrElse()
将列表中的每一项附加到表达式体。最后,使用expression.Call()
返回表达式GetAdvisorCustomers
做什么?另外,您正在这里调用.Result
,这非常危险。您应该等待那个调用。@DavidG关于GetAdvisorCustomers
,它只是传递一个列表。关于wait,这是我继承的代码,所以它在待办事项列表上:)我不明白你的话说(意译)“当我调用ToList()时它正在发生”,你的代码commnt说“在我调用ToList()后它正在发生”@CaiusJard每当我执行.ToList()时都会抛出错误。但是,如果我使用更简单的方法(例如基本字符串比较)重写Where
,则不会抛出错误。您不能将列表
作为实体中的类型,我假设这就是抛出错误的原因。
private IQueryable<CollectionActivityInOverview> FilterActivitiesForAdvisor(IQueryable<CollectionActivityInOverview> activitiesList, List<string> advisorCodes)
{
List<AdvisorCustomerInfo>advisorInformation = GetAdvisorCustomers(advisorCodes).Result;
var advisorCustomers = advisorInformation.SelectMany(a => a.Customers)
.Distinct()
.ToList();
// This is the problematic spot
activitiesList = activitiesList.Where(a => advisorCustomers.Any(ac => ac == a.CustomerId));
return activitiesList;
}
public class AdvisorCustomerInfo
{
public string AdvisorCode { get; set; }
public List<string> Customers { get; set; }
}