Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ查询中使用来自反射的值_C#_.net_Linq - Fatal编程技术网

C# 在LINQ查询中使用来自反射的值

C# 在LINQ查询中使用来自反射的值,c#,.net,linq,C#,.net,Linq,我试图通过反射访问LINQ查询中联系人的值。我正在使用.NETC# 因此,我有一个数据类,在该类中,我也使用反射从具有特定属性的属性中获取值([conexiosarchfield]) 例如: [ConexioSearchField] public string FullName { get; set; } 这是我现在执行此操作的代码: //Starting the Linq Query var unitOfWork = new SynchronizationUnitOfWork(_contex

我试图通过反射访问LINQ查询中联系人的值。我正在使用.NETC#

因此,我有一个数据类,在该类中,我也使用反射从具有特定属性的属性中获取值(
[conexiosarchfield]

例如:

[ConexioSearchField]
public string FullName { get; set; }
这是我现在执行此操作的代码:

//Starting the Linq Query
var unitOfWork = new SynchronizationUnitOfWork(_context);
var repository = unitOfWork.RepositoryAsync<TC>();
var entities = repository.Queryable();

var firstOrDefault = EntityTypeDescriptorStore.GetEntityTypeDescriptor<TC>().Properties.FirstOrDefault(sf => sf.IsSearchField);
if (firstOrDefault == null) return entities;

var propertyInfo = firstOrDefault.PropertyInfo;

entities = type == HandledType.Doubtful
                ? entities.Where(entity1 => entity1.IsDoubtful && propertyInfo.GetValue(entity1).ToString().Contains(nameFilter))
                : entities.Where(entity1 => propertyInfo.GetValue(entity1).ToString().Contains(nameFilter));
//启动Linq查询
var unitOfWork=新同步unitOfWork(_上下文);
var repository=unitOfWork.RepositoryAsync();
var entities=repository.Queryable();
var firstOrDefault=EntityTypeDescriptorStore.GetEntityTypeDescriptor().Properties.firstOrDefault(sf=>sf.IsSearchField);
if(firstOrDefault==null)返回实体;
var propertyInfo=firstOrDefault.propertyInfo;
实体=类型==HandledType.可疑
? entities.Where(entity1=>entity1.IsDoubtful&&propertyInfo.GetValue(entity1.ToString().Contains(nameFilter))
:entities.Where(entity1=>propertyInfo.GetValue(entity1.ToString().Contains(nameFilter));
但这是我的错误:

Test method Conexio.Core.Orchestration.Test.Doubtfuls.SearchContactsTest.TestSearch3 threw 

exception: 
System.AggregateException: One or more errors occurred. ---> System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Object GetValue(System.Object)' method, and this method cannot be translated into a store expression.
    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)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.StringTranslatorUtil.ConvertToString(ExpressionConverter parent, Expression linqExpression)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.ToStringTranslator.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)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateFunctionIntoLike(MethodCallExpression call, Boolean insertPercentAtStart, Boolean insertPercentAtEnd, Func`5 defaultTranslator)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.StringContainsTranslator.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)
   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, ref DbExpressionBinding binding)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, ref DbExpression source, ref DbExpressionBinding sourceBinding, ref 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 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, ref DbExpression source, ref DbExpressionBinding sourceBinding, ref 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 parent, Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.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)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.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)
   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.ObjectQuery`1.<>c__DisplayClassc.<GetResultsAsync>b__a()
   at System.Data.Entity.Core.Objects.ObjectContext.<ExecuteInTransactionAsync>d__3d`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<ExecuteAsyncImplementation>d__9`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Data.Entity.Utilities.TaskExtensions.CultureAwaiter`1.GetResult()
   at System.Data.Entity.Core.Objects.ObjectQuery`1.<GetResultsAsync>d__e.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Data.Entity.Utilities.TaskExtensions.CultureAwaiter`1.GetResult()
   at System.Data.Entity.Internal.LazyAsyncEnumerator`1.<FirstMoveNextAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.<ForEachAsync>d__5`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Conexio.Core.Orchestration.Contacts.Doubtfuls.SearchDoubtfuls`3.<SearchAsync>d__5.MoveNext() in SearchDoubtfuls.cs: line 59
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Conexio.Core.Orchestration.Contacts.ConexioEntityBL`3.<SearchDoubtfulsAsync>d__28.MoveNext() in ConexioEntityBL.cs: line 323
 --- End of inner exception stack trace ---
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at Conexio.Core.Orchestration.Test.Doubtfuls.SearchContactsTest.TestSearch3() in SearchContactsTest.cs: line 77
测试方法Conexio.Core.Orchestration.Test.doublefuls.SearchContactsTest.TestSearch3
例外情况:
System.AggregateException:发生一个或多个错误。-->System.NotSupportedException:LINQ to Entities无法识别方法“System.Object GetValue(System.Object)”方法,并且无法将此方法转换为存储表达式。
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,Expression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.StringTranslatorUtil.ConvertToString(ExpressionConverter父级,表达式linqExpression)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.ToString Translator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,Expression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TranslateFunctionIntoLike(MethodCallExpression调用、Boolean insertPercentAtStart、Boolean InsertPercentateEnd、Func`5 defaultTranslator)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.StringContainerTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,Expression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
位于System.Data.Entity.Core.Objects.eliq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression input)
位于System.Data.Entity.Core.Objects.eliq.ExpressionConverter.TranslateLambda(LambdaExpression lambda、DbExpression input、ref DbExpressionBinding)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级、MethodCallExpression调用、ref-DbExpression源、ref-DbExpressionBinding源绑定、ref-DbExpressionLambda)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用,SequenceMethod SequenceMethod)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,Expression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级、MethodCallExpression调用、ref-DbExpression源、ref-DbExpressionBinding源绑定、ref-DbExpressionLambda)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter父级,MethodCallExpression调用,SequenceMethod SequenceMethod)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter父级,Expression linq)
位于System.Data.Entity.Core.Objects.Elink.ExpressionConverter.TranslateExpression(表达式linq)
在System.Data.Entity.Core.Objects.ElIQ.ExpressionConver
var entity1 = Expression.Parameter(typeof(Entity));
var nameFilterExp = Expression.Call(
    Expression.Property(entity1, firstOrDefault.PropertyInfo.Name),
    typeof(string).GetMethod("Contains", new[] { typeof(string) }),
    Expression.Constant(nameFilter)
);
var predicate = Expression.Lambda<Func<Entity, bool>>(
    type == HandledType.Doubtful
        ? (Expression)Expression.AndAlso(Expression.Equal(Expression.Property(entity1, "IsDoubtful"), Expression.Constant(true)), nameFilterExp)
        : (Expression)nameFilterExp,
    entity1);
entities = entities.Where(predicate);