2015-05-26 4 views
3

Я получаю исключение, указанное в кавычках ниже. Я попытался удалить проблему много, но я получаю исключение ниже. Я прочитал знакомые ответы на мою проблему в стеке над потоком, но они не решают мою проблему. Я также прокомментировал выше, где я получаю исключение.System.String ElementAt [String] (System.Collections.Generic.IEnumerable1 [System.String], Int32) 'метод

System.NotSupportedException был необработанным кодом пользователя
HResult = -2146233067 = Сообщение LINQ к Entities не распознает метода «System.String ElementAt [String] (System.Collections.Generic.IEnumerable 1[System.String], Int32)' method, and this method cannot be translated into a store expression. Source=EntityFramework StackTrace: at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1 .Translate (ExpressionConverter родителя, выражение LINQ) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression (Выражение LinQ) на System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.UnaryTranslator. TypedTranslate (ExpressionConverter parent, UnaryExpression linq) на System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1.Translate (ExpressionConverter родителя, выражение LINQ) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression (Выражение LINQ) на System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda (LambdaExpression лямбда, входной DbExpression) на System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda (LambdaExpression лямбда, вход DbExpression , DbExpressionBinding &) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate (ExpressionConverter родителя, MethodCallExpression вызов, DbExpression & источника, DbExpressionBinding & sourceBinding, DbExpression & лямбды) на System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate (ExpressionConverter родителя, MethodCallExpression вызова) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate (ExpressionConverter родитель, MethodCallExpression вызов, SequenceMethod sequenceMethod) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate (ExpressionConverter parent, MethodCallExpression linq) 44445164 +10617451515053691368888 на System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator 1.Translate (ExpressionConverter родителя, выражение LINQ) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression (Выражение LINQ) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateSet (Выражение LinQ) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate (ExpressionConverter родителя, MethodCallExpression вызов) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate (ExpressionConverter parent, MethodC allExpression вызов, SequenceMethod sequenceMethod) на System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate (ExpressionConverter родитель, MethodCallExpression LINQ) в System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator forMergeOption) в System.Data.Entity.Core.Objects.ObjectQuery FUNC, IDbExecutionStrategy executionStrategy, булева startLocalTransaction, булева releaseConnectionOnSuccess) на System.Data.Entity.Core.Objects.ObjectQuery операции) на System.Data.Entity.Core.Objects.ObjectQuery forMergeOption) на System.Data.Entity.Core.Objects.ObjectQuery 1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() at System.Data.Entity.Internal.LazyEnumerator 1.MoveNext() в System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable последовательности) в System.Data.Entity. Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle [TResult] (IEnumerable 1 query, Expression queryRoot) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1 кислый в.п.) в Neon.DBHandler.registerStudentCourses (строка р, List`1 coursesIdSelected) в C: \ Users \ AbdullahABBASI \ Desktop \ AbbasiWebProject \ неон \ Models \ DBHandler.cs: линия в Neon.Student_RegisterCourse.registerbutton_Click (отправитель объекта, EventArgs е) в C: \ Users \ AbdullahABBASI \ Desktop \ AbbasiWebProject \ неон \ Student_RegisterCourse.aspx.cs: линия на System.Web.UI.WebControls.Button.OnClick (EventArgs е) в системе .Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) на System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) на System.Web.UI.Page. RaisePostBackEvent (IPost BackEventHandler SourceControl, String eventArgument) на System.Web.UI.Page.RaisePostBackEvent (NameValueCollection PostData) в System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:

код ниже:

internal static void registerStudentCourses(string p, List<string> coursesIdSelected) 
{ 
    AbbasiDatabaseEntities objDB = new AbbasiDatabaseEntities(); 
    Student objStudent = objDB.Students.Where(s => s.Id == p).FirstOrDefault(); 
    List<Course> courses = new List<Course>(); 

    for (int i = 0; i<coursesIdSelected.Count; i++) 
    { 
     //in the line below i am getting exception mentioned above 
     var course = objDB.Courses 
      .Where(c => c.Id == (string)coursesIdSelected.ElementAt(i)) 
      .Select(s=> s) 
      .FirstOrDefault(); 
     courses.Add(course); 
    } 

    objStudent.Courses = courses;  
} 
+0

LINQ запрос преобразуется в SQL во время выполнения. По этой причине .ElementAt (i) недоступен. – gypsyCoder

+0

Вы выполняете 'SELECT N + 1' (технически это' SELECT N') ... в общем, это антипаттерн (вы делаете выбор в для цикла, поэтому в db будет выполняться n отдельных запросов). – xanatos

ответ

8

Объект Framework не может преобразовать Where(c => c.Id == (string)coursesIdSelected.ElementAt(i)) в запрос.

Введем переменную помощника, чтобы удалить этот код из вашего запроса:

for (int i = 0; i<coursesIdSelected.Count; i++){ 
    string selectedCourse = (string)coursesIdSelected.ElementAt(i); 
    var course = objDB.Courses.Where(c => c.Id == selectedCourse).Select(s=> s).FirstOrDefault(); 
    courses.Add(course); 
} 

Или упростить весь цикл до:

student.Courses = db.Courses.Where(c => coursesIdSelected.Contains(c.Id.ToString())); 
+1

Рассматривая «Список курсовIdSelected', элемент« ElementAt() »может быть изменен на' [] '(а затем, возможно, он будет работать напрямую). – xanatos

+0

@xanatos true, это может сработать. Не могу проверить это сейчас. – CodeCaster

+2

Лучше второй ... Он решает антипаттерн делать 'select' внутри' for' – xanatos

Смежные вопросы