LINQ: оператор запроса 'ElementAtOrDefault' не поддерживается - PullRequest
6 голосов
/ 09 ноября 2010

Почему следующий код выдает ошибку?

Оператор запроса '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 Ответ

10 голосов
/ 09 ноября 2010

Что вам нужно сделать, это добавить .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 ()

Hopeэто помогает!

...