System.String Method ElementAt [String] (System.Collections.Generic.IEnumerable1) [System.String], Int32)
I am getting the exception mentioned in the quotes below. I tried to remove the problem a lot, but I am getting below exception. I have read the familiar answers to my stack over thread problem, but they don't solve my problem. I also commented above line where I am getting the exception.
System.NotSupportedException not handled by user code
HResult = -2146233067 Message = LINQ to Entities does not recognize method 'System.String ElementAt [String] (System.Collections.Generic.IEnumerable1[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 parent, Expression linq) in System.Data. Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression (LINQ Expression) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate (ExpressionConverter parent, UnaryExpression linq) at System.Data.Entity.Categories .ELinq.ExpressionConverter.TypedTranslator1.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 parent, Expression linq) to System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression (LINQ expression) to System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda (LambdaExpression lambda DbExpression) to System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda (LambdaExpression lambda, DbExpression input, DbExpressionBinding & Binding) to System.Data.Entity.Core.Objects.ELinq.ExpressionTranslator.MethodCallTneator ExpressionConverter parent, Call MethodCallExpression, DbExpression & source, DbExpressionBinding & sourceBinding, DbExpression & lambda) in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate (ExpressionConverter parent, call MethodCallExpression) in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslate (ExpressionConverter parent, call MethodCallExpression, sequence SequenceMethodMethod) in System.Data.ELntore) .ExpressionConverter.MethodCallTranslator.TypedTranslate (ExpressionConverter parent, MethodCallExpression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslatorMethodCallTranslator.TypedTranslate (ExpressionConverter parent, MethodCallExpression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslatorMethodCallTranslator.TypedTranslate (ExpressionConverter parent, MethodCallExpression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator1.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 parent, Expression linq) to System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression (LINQ Expression) to System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateSet (LINQ Expression) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate (ExpressionConverter parent, Calling MethodCallExpression) at System.Data.Entity.Core.Obljects.ELinq.ExpressionConverter.MethodCallTranslator , MethodCallExpression call, SequenceMethodMethod sequence) in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate (ExpressionConverter parent, MethodCallExpression linq) in System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert() at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable
1 forMergeOption) at System.Data.Entity.Core.Objects.ObjectQuery1.<>c__DisplayClass7.<GetResults>b__6() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func
1 func, IDbExecutionStrategy executeStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) at System.Data.Entity.Core.Objects.Objectity.Duery.Entity1.<>c__DisplayClass7.<GetResults>b__5() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func
1) operation at SystemQuery. .Objects.ObjectQuery1.GetResults(Nullable
1 forMergeOption) at System.Data.Entity.Core.Objects.ObjectQuery1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() at System.Data.Entity.Internal.LazyEnumerator
1.MoveNext () at System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable1 source) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable
1 sequence) at System.Data.Entity.Core.Objects .ELinq.ObjectQueryProvider.ExecuteSingle [TResult] (IEnumerable1 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 source) at Neon.DBHandler.registerStudentCourses (String p, List`1 coursesIdSelected) at C: \ Users \ AbdullahABBASI \ Desktop \ AbbasiWebProject \ neon \ Models \ DBHandler.cs: line 246 at Neon.Student_RegisterCourse.registerbutton_Courses EventArgs e) at C: \ Users \ AbdullahABBASI \ Desktop \ AbbasiWebProject \ Neon \ Student_RegisterCourse.aspx.cs: line 51 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 (System IPostBackEvent) .Web.UI.Page.RaisePostBackEvent (NameValueCollection postData) at System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
Code below:
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;
}
source to share
Entity Framework cannot convert Where(c => c.Id == (string)coursesIdSelected.ElementAt(i))
to request.
Introduce a helper variable to remove this code from your request:
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);
}
Or simplify the whole loop to:
student.Courses = db.Courses.Where(c => coursesIdSelected.Contains(c.Id.ToString()));
source to share