错误表示表达式必须是CollectionType。

时间:2012-03-15 08:27:18

标签: .net vb.net linq asp.net-mvc-3 entity-framework

正如我的标题所说,我在尝试制作一些实体SQL请求时遇到了麻烦。

这里的整个代码必须用作搜索引擎。我需要构建字符串,然后将它们转换为查询。我已经用linq-to-sql完成了所有工作。但似乎不可能将字符串转换为linq查询。但是,我在stackoverflow上发现了一种解决方案,但我从未能够使用它:String.ToLinqQuery()。它只是视觉工作室不知道,我找不到任何关于它的文档。

虽然,这是我得到的错误:

  

指定的表达式必须是CollectionType。近括号表达式,第1行,第20列。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

     

异常详细信息:System.Data.EntitySqlException:指定的表达式必须是CollectionType。近括号表达式,第1行,第20列。

     

来源错误:

     

第145行:会议
  第146行:
  第147行:@For在Model.Meetings中的每次会议
  第148行:@

    @ meeting.date
      第149行:@ Html.ActionLink(“编辑”,“编辑”,“会议”,新建{.id = meeting.idmeeting},“空”)

这是我的所有代码:控制器:

  Imports System.Data.Objects
  Imports System.Linq.Expressions

  Namespace MvcApplication4
   Public Class SearchController
    Inherits System.Web.Mvc.Controller

    <HttpPost()>
    Function Index(search As String, choix As Integer) As ActionResult
        Dim test As Integer = Request("choix")
        Dim chaine As String = Request("searchString")
        Dim message As String = "message"

        Dim requete As String = "Select value p FROM('db.meeting') as p where p.compteRendu LIKE '%chaine%'"
        Dim meetings = New ObjectQuery(Of meeting)(requete, db)

        Dim model = New SearchModel With {
            .Meetings = meetings,
            }
        Return View(model)
    End Function
   End Class
  End Namespace

模型:

  Public Class SearchModel
     Public Property Meetings As IEnumerable(Of meeting)
  End Class

查看:

  @Modeltype MvcApplication4.SearchModel

   @<fieldset>
    <legend>Meetings</legend>
         @For Each meeting In Model.Meetings
               @<ul> @meeting.date 
               @Html.ActionLink("Edit", "Edit", "Meeting", New With {.id = meeting.idmeeting}, "Null") </ul>
               @<li> @Html.Raw(meeting.compteRendu.Replace(System.Environment.NewLine, "<br />"))</li>
         Next meeting
    </fieldset>

我做错了什么?

这是我的.edmx模型的一部分

<EntityType Name="meeting">
      <Key>
        <PropertyRef Name="idmeeting" />
      </Key>
      <Property Name="idmeeting" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="FK_meet_client" Type="int" />
      <Property Name="FK_meet_contact" Type="int" />
      <Property Name="FK_meet_opport" Type="int" />
      <Property Name="FK_meet_user" Type="int" />
      <Property Name="compteRendu" Type="longtext" />
      <Property Name="date" Type="datetime" />
      <Property Name="adresse" Type="text" />
    </EntityType>

2 个答案:

答案 0 :(得分:1)

ESQL查询中的FROM部分似乎有误。尝试使用:

Select value p FROM db.meeting as p where p.compteRendu LIKE '%chaine%'

答案 1 :(得分:0)

我没有真正找到解决方案。我使用另一种方式处理我的搜索,使用Linq的谓词构建器。

谓词构建器的代码已从http://www.albahari.com/nutshell/predicatebuilder.aspx

获取(并转换为VB)

这是VB中谓词构建器的代码

Imports System.Linq
Imports System.Linq.Expressions
Imports System.Collections.Generic
Imports System.Runtime.CompilerServices

Module PredicateBuilder
Sub New()
End Sub
Public Function [True](Of T)() As Expression(Of Func(Of T, Boolean))
    Return Function(f) True
End Function
Public Function [False](Of T)() As Expression(Of Func(Of T, Boolean))
    Return Function(f) False
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function [Or](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
    Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
    Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[OrElse](expr1.Body, invokedExpr), expr1.Parameters)
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function [And](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
    Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
    Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[AndAlso](expr1.Body, invokedExpr), expr1.Parameters)
End Function
End Module

以下是我如何使用它:

        Dim predicate1 = PredicateBuilder.False(Of meeting)()
        For Each mot In tabMot
            predicate1 = predicate1.Or(Function(m) m.compteRendu.Contains(mot))
        Next
        Dim meetings = db.meeting.AsExpandable().Where(predicate1)