System.String ElementAt [String](System.Collections.Generic.IEnumerable`1 [System.String],Int32)'方法

Abd*_*asi 3 c# linq asp.net entity-framework

我收到了下面引用中提到的例外情况.我试图删除这个问题很多,但我得到下面的例外.我已经在堆栈溢出流程中读到了我的问题的类似答案,但它们并没有解决我的问题.我也在上面评论了我收到异常的行.

System.NotSupportedException未由用户代码处理
HResult = -2146233067 Message = LINQ to 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.TypedTranslator1.Translate(ExpressionConverter parent,Expression linq)at System System.Data.Entity上的System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent,UnaryExpression linq)中的.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq). 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.TypedTranslator1.在System.Data.Entity.Core.Objects的System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)上翻译(ExpressionConverter parent,Expression linq). System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression输入,DbExpressionBinding&bin)中的ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression输入)在System.Data.Entity.Core.Objects.ELinq的System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression call,DbExpression&source,DbExpressionBinding&sourceBinding,DbExpression&lambda)处. System.Data上的System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent,MethodCallExpression call,SequenceMethod sequenceMethod)中的.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression call). System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator的Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent,MethodCallExpression linq)1.在System.Data上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翻译(ExpressionConverter parent,Expression linq) .Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式 Linq)at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateSet(Expression linq)at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent,MethodCallExpression call)at at在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent)中的System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent,MethodCallExpression call,SequenceMethod sequenceMethod) ,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.Convert() at System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable1 forMergeOption的SystemCallExpression linq)在System.Data.Entity.Core.Objects.ObjectQuery 1 1.<>c__DisplayClass7.<GetResults>b__6() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Funcfunc,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)at System.1.<>c__DisplayClass7.<GetResults>b__5() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](FuncSystem.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable1 forM中的Data.Entity.Core.Objects.ObjectQuery 1操作)ergeOption)位于System.Data.Entity.Core.Object.Proinq.ObjectQueryProvider的System.Data.Entity.Core.Objects.ObjectQuery 1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() at System.Data.Entity.Internal.LazyEnumerator1.MoveNext()处于System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable 1 source) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable1序列).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在Neon.Student_RegisterCourse的c:\ Users\AbdullahABBASI\Desktop\AbbasiWebProject\Neon\Models\DBHandler.cs:第246行的Neon.DBHandler.registerStudentCourses(String p,List`1 coursesIdSelected)中的ExecuteSingle [TResult](IEnumerable 1 source) .registerbutton_Click(Object sender,EventArgs e)位于c:\ Users\AbdullahABBASI\Desktop\AbbasiWebProject\Neon\Student_RegisterCourse.aspx.cs:System 51的System.Web.UI.WebControls.Button.OnClick(EventArgs e)第51行. System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl)中的System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)中的Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) ,System eventArgument)在System.Web.UI.Page.RaisePostBackEvent(NameValueCollection p)System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)
InnerException:ostData):

代码如下:

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;    
} 
Run Code Online (Sandbox Code Playgroud)

Cod*_*ter 8

实体框架无法转换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);
}
Run Code Online (Sandbox Code Playgroud)

或者将整个循环简化为:

student.Courses = db.Courses.Where(c => coursesIdSelected.Contains(c.Id.ToString()));
Run Code Online (Sandbox Code Playgroud)

  • 更好的第二个......它解决了在`for`中做`select`的反模式 (2认同)