LINQ:不支持查询运算符'ElementAtOrDefault'

时间:2010-11-08 21:19:58

标签: asp.net vb.net linq anonymous-types

为什么以下代码会产生错误?

  

不支持查询运算符'ElementAtOrDefault'

Dim Im = (From view In Db.Views Where _
               view.Pass = txtCode.Text _
          Select New With {.Id = view.UniqueID.ToString}_
          ).Distinct

Response.Redirect("~/test.aspx?x=" & Im(0).Id)

有没有办法在不使用FirstOrDefault选项的情况下修复它?

更新:这是StackTrace

   at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
   at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.ElementAtOrDefault[TSource](IQueryable`1 source, Int32 index)
   at Login.btnLogin_Click(Object sender, EventArgs e) in D:\Projects\Memoria\Login.aspx.vb:line 14
   at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

1 个答案:

答案 0 :(得分:10)

您需要做的是在查询结尾添加.ToList()。这应该有效:

Dim Im = (From view In Db.Views Where _
           view.Pass = txtCode.Text _
      Select New With {.Id = view.UniqueID.ToString}_
      ).Distinct.ToList()

Response.Redirect("~/test.aspx?x=" & Im(0).Id)

如果没有.ToList(),查询只返回DataQuery(Of T)而不是List(Of T)。添加ToList调用有两个作用:

  1. 强制查询立即执行,
  2. 返回支持ElementAtOrDefault()
  3. 的集合类型

    希望有所帮助!