你如何将FirstOrDefault与Include一起使用?

pid*_*rep 9 .net c# linq entity-framework

这很好用:

return Members
          .FirstOrDefault(m => m.Agreement.Equals(agreement));
Run Code Online (Sandbox Code Playgroud)

但如果找不到匹配项,则抛出异常:

 return Members
            .Include("Files")
            .FirstOrDefault(m => m.Agreement.Equals(agreement) &&
            !m.Files.Any(f => f.Status.Equals(12)));
Run Code Online (Sandbox Code Playgroud)

那么当我使用Include时,如何获得first/default(可能为null)?

例外是:

System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator中System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent,ConstantExpression linq)的意外异常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.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( System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator中的ExpressionConverter parent,MethodCallExpression调用,DbExpression&source,DbExpressionBinding&sourceBinding,DbExpression&lambda).在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent,MethodCallExpression call,SequenceMethod sequenceMethod)中翻译(ExpressionConverter parent,MethodCallExpression调用)
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父,MethodCallExpression 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.NotTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator1.Translate(ExpressionConverter父,表达LINQ )在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式LINQ)在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter父,BinaryExpression LINQ)在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.TranslateLambda(LambdaExpression lambda, DbExpression input) at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding) 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.OneLambdaTranslator.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.MethodCallTranslator.AggregateTranslator.Translate (ExpressionConverter父,MethodCallExpression呼叫)在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter父,MethodCallExpression呼叫,SequenceMethod sequenceMethod)
在System.Data.Entity.Core.Objects.ELinq. System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TypedTranslator中的ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent,MethodCallExpression linq)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(Nullable
1 forMergeOption)在System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass7.<GetResults>b__6() at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func1 func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)at System.Data.Entity.Core.Objects.ObjectQuery 1.<>c__DisplayClass7.<GetResults>b__5() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 operation)at System.Data.Entity.Core 1.GetResults(NullableSystem.Data.Entity.Core.Objects上的System.Data.Entity.Core.Objects.ObjectQuery 1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() at System.Data.Entity.Internal.LazyEnumerator1.MoveNext()处于System.Data.Entity.Core.Objects的System.Linq.Enumerable.Single [TSource](IEnumerable 1 source) at System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3[TResult](IEnumerable1序列)的.Objects.ObjectQuery 1 forMergeOption .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.Count[TSource](IQueryable1 source)

Ned*_*nov 10

这个怎么样:

return Members
    .Include("Files")
    .Where(m => m.Agreement.Equals(agreement) &&
                m.Files != null &&
               !m.Files.Any(f => f.Status.Equals(12)))
    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)


Ogg*_*las 6

使用Microsoft.EntityFrameworkCore 3.1.7这个效果很好:

var myEntity = await dbContext.MyEntities.Include(x => x.MyOtherEntities).FirstOrDefaultAsync(x => x.Name == "Not existing name");
Run Code Online (Sandbox Code Playgroud)