2010-11-08 13 views
6

Warum der folgende Code den Fehler erzeugt?LINQ: Der Abfrage-Operator 'ElementAtOrDefault' wird nicht unterstützt

Die Abfrage Operator 'ElementAtOrDefault' wird

nicht unterstützt
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) 

Gibt es eine Möglichkeit, es zu fixieren, ohne die FirstOrDefault Option?

UPDATE: Und hier ist der 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) 

Antwort

10

Was Sie tun müssen, ist .ToList() bis zum Ende Ihrer Abfrage hinzuzufügen. Dies sollte funktionieren:

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) 

Ohne .ToList(), die Abfrage nur ein Dataquery zurückgibt (Of T) statt einer List (Of T). Hinzufügen des ToList Anruf macht zwei Dinge:

  1. Forces die Abfrage auszuführen sofort und
  2. Gibt eine Sammlung Typ, ElementAtOrDefault()

Hoffnung unterstützt, das hilft!

+0

Das ist wahr, da ich anonymen Typ zurückgebe – OrElse

Verwandte Themen