正如我的标题所说,我在尝试制作一些实体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>
答案 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)