LINQ表达式无法翻译!为什么?

时间:2020-10-09 09:16:13

标签: c# linq expression linq-expressions

在特定条件下,我试图从表中检索一些记录...这是我的代码:

var areas = _context.Set<T>()
                .Where(p => (int)p.GetType().GetProperty(campoOrdem).GetValue(p) >= indexMin &&
                    (int)p.GetType().GetProperty(campoOrdem).GetValue(p) <= indexMax).ToList();

我遇到此错误:

'LINQ表达式'DbSet 哪里(r =>(int)r.GetType()。GetProperty(__ campoOrdem_0).GetValue(r)> = __indexMin_1 &&(int)r.GetType()。GetProperty(__ campoOrdem_0).GetValue(r)<= __indexMax_2)'无法翻译。

我所有的变量都获取正确的值。campoOrdem是包含字段名称的字符串,indexMin和indexMax是我在数据库中的订单值,在示例中,indexMin为1,indexMax为2 ...

发生了什么事?

1 个答案:

答案 0 :(得分:2)

反射对您要执行的操作无效,但是如果属性始终具有相同的名称,则可以使用通用约束(如果可以将该接口添加到所有相关实体):

 public interface IEntityWithCampoOrdem
 {
     public int CampoOrdem { get; } // property name should always be the same
 }

这假设可以像这样定义实体RH_Cargos

 public class RH_Cargos : IEntityWithCampoOrdem
 {
      // other properties

      public int CampoOrdem { get; set; }
 }

现在您可以像这样创建通用方法:

 public void GetAreas<T>() where T : IEntityWithCampoOrdem
 {
     var areas = _context.Set<T>()
            .Where(p => p.CampoOrdem >= indexMin &&
                p.CampoOrdem <= indexMax).ToList();
 }