我得到了以下代码并且我总是得到相同的错误,但是我无法找出为什么在第一级(所有函数)我可以使用它可以比较复杂对象但在Any函数中它给了我跟随错误。
无法创建“ConsoleApplication1.Param”类型的常量值。在此上下文中仅支持基本类型(例如Int32,String和Guid')
这是代码
Dim listParams As List(Of Param) = Nothing
listParams = New List(Of Param)(2)
Dim new_param as Param
new_param = new Param()
new_param.Name = "p1"
new_param.Value = "a"
listParams.Add(new_param)
new_param = new Param()
new_param.Name = "p2"
new_param.Value = "231"
listParams.Add(new_param)
Dim aux As IQueryable(Of Part)
aux = From p In CurrentBD.Parts
Where p.code = find_pattern _
And p.version = find_version _
And p.Params.Count = listParams.Count _
And p.Params.All(Function(p1 As Parametro) listParams.Any(Function(p2) p2.Name = p1.Name AndAlso (p2.Value = p1.Value OrElse p1.Value = "IRRELEVANT")) )
Select p
Dim hist_part as Part
hist_part = aux.FirstOrDefault()
查询的要点是获取属于模式的所有已注册零件,但是零件参数的值和名称都与列表中的一次相匹配
我做错了吗?显然我是,什么???
提前感谢任何可以帮助我或给我线索的人。
答案 0 :(得分:1)
错误:
p.Params.All(Function(p1 As Parametro) listParams.Any(Function(p2) ...
答案 1 :(得分:0)
我认为问题出现在查询的这个子句中:
p.Params.All(Function(p1 As Parametro) listParams.Any(Function(p2) ...
变量listParams
是本地列表,因此需要在本地(而不是在SQL服务器上)评估Any
调用。但是,它包含在lambda表达式中,需要在SQL端(p.Params.All()
)进行求值,这是不可能的。 Entity Framework支持的唯一本地列表(IEnumerable而不是IQueryable)操作是Contains
,它在SQL端被转换为IN
语句。您可以尝试重构Any
以使用Contains
,尽管这可能很难。我可能会把它拆分成一个过滤到name的子句,然后在客户端进行值过滤:
// create listParamNames list containing only names, then update query
//...
p.Params.All(Function(p1 As Parametro) listParamNames.Contains(p1.Name))
//...