繁体   English   中英

C#Linq通用搜索

[英]C# Linq generic search

我正在尝试为基础存储库服务编写一种方法。 我的想法是我想要一个可以用于简单实体类型的泛型类,也可以为更复杂的实体覆盖。 我正在编写一种搜索方法,其想法是,对于简单实体,将存在一个组件,该组件将具有一个或多个属性,且字段与该实体的属性相匹配。 如果找到了这些,则构建一个where linq语句来查询它。 这是我到目前为止的内容:

  public IQueryable<T> GetAll()
  {
     return entityRepository.GetAll();
  }

  public IQueryable<T> Search(IBaseComponent component)
  {
     IQueryable<T> all = GetAll();
     Type type = typeof(T);
     Type componentType = component.GetType();

     foreach (var componentProperty in componentType.GetProperties())
      {
        foreach (var property in type.GetProperties())
        {
           if (property.Name.Equals(componentProperty.Name))
           {
              var value = componentProperty.GetValue(component);

              ParameterExpression gpe = Expression.Parameter(property.DeclaringType, "a");
              var selector = Expression.Equal(Expression.Property(gpe, property), Expression.Constant(value));
              var keySelector = Expression.Lambda(selector, gpe);

              var t = all.Where(keySelector);

              break;
           }
        }
      }

     var test = all.ToArray();

     return all;
  }

显然,这目前仅在理论上适用于一种财产。 服务本身具有类型参数(因此其BaseService<T> )。

我遇到的问题是它将无法编译。 all.Where(keySelector)给出错误:

    'System.Linq.IQueryable<T>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,bool>)' has some invalid arguments

我不确定这里出什么问题,据我所知,它们的类型都是正确的。 我想念什么? 还是我想做些不可能的事情?

即使具体类型为Expression<Func<T, bool>> Expression.Lambda返回类型也为LambdaExpressionLambdaExpressionExpression<T>的非通用基类)

@Euphoric的评论很明显,而var关键字是这里的问题,因为没有它,此错误的原因就很明显了。

正确的代码是这样的:

var keySelector = (Expression<Func<T, bool>>)Expression.Lambda(selector, gpe);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM