2010-11-08 39 views
6

Tại sao mã sau tạo lỗi?LINQ: Toán tử truy vấn 'ElementAtOrDefault' không được hỗ trợ

Nhà điều hành truy vấn 'ElementAtOrDefault' không được hỗ trợ

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) 

Có cách nào sửa chữa nó mà không sử dụng tùy chọn FirstOrDefault?

UPDATE: Và đây là 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) 

Trả lời

10

Những gì bạn cần làm là thêm .ToList() đến hết truy vấn của bạn. Điều này sẽ hoạt động:

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) 

, truy vấn chỉ trả về một DataQuery (T) thay vì danh sách (T). Thêm cuộc gọi ToList thực hiện hai điều:

  1. Lực lượng truy vấn để thực hiện ngay lập tức, và
  2. Trả về một loại bộ sưu tập có hỗ trợ ElementAtOrDefault()

Hy vọng rằng sẽ giúp!

+0

Thats true, kể từ khi tôi trở về kiểu ẩn danh – OrElse

Các vấn đề liên quan