3

我得到了以下代码,但我总是得到相同的错误,但我无法找出为什么在第一级(所有函数)中我可以使用可以比较复杂对象但在 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()

查询的重点是获取所有注册的属于pattern的part,但是part的参数的值和名称都匹配到列表中的一次

难道我做错了什么?明明是我,什么???

提前感谢任何可以帮助我或给我线索的人。

4

2 回答 2

1

这里的错误:

p.Params.All(Function(p1 As Parametro) listParams.Any(Function(p2) ...
于 2013-09-06T12:00:24.283 回答
0

我认为问题出在查询的这个子句中:

p.Params.All(Function(p1 As Parametro) listParams.Any(Function(p2) ...

该变量listParams是一个本地列表,因此Any需要在本地(而不是在 SQL 服务器上)评估调用。但是,它包含在 lambda 表达式中,需要在 SQL 端 ( p.Params.All()) 进行评估,这是不可能的。Entity Framework 支持的唯一本地列表(IEnumerable 而不是 IQueryable)操作是Contains,它被翻译成INSQL 端的语句。您可以尝试重构您的AnyContains代替使用,尽管这可能很困难。我可能会将其拆分为一个过滤到名称的子句,然后在客户端进行值过滤:

// create listParamNames list containing only names, then update query
//...
p.Params.All(Function(p1 As Parametro) listParamNames.Contains(p1.Name))
//...
于 2013-09-06T11:54:35.140 回答