LINQ to Entities无法识别方法'<> f__AnonymousType9`2 [System.Nullable`1 [System.Int32],System.Nullable`

时间:2019-04-09 18:37:16

标签: c# linq

在C#中执行linq表达式后出现错误。我可以在调试时在where子句中看到值,但不确定为什么会得到空异常

以下是错误

'LINQ to Entities does not recognize the method '<>f__AnonymousType9`2[System.Nullable`1[System.Int32],System.Nullable`1[System.Int32]] get_Item(Int32)' method, and this method cannot be translated into a store expression.'

获得ID的第一步

var benchmarks = GetService<MANAGERSTRATEGY>().Where(x => x.ID == id).Select(x => new { x.BENCHMARK1_ID, x.BENCHMARK2_ID }).ToList();

第二步是我根据值获取ID

    var indexPerformance = GetViewService<MV_INDEX_PERFORMANCE>().Where(x=>  x.IndexId == benchmarks[0].BENCHMARK1_ID || x.IndexId == benchmarks[0].BENCHMARK2_ID);

enter image description here

第一个参数的值 enter image description here

第二个参数的值 enter image description here

该模型用于oracle中的物化视图

  public class MV_INDEX_PERFORMANCE : ViewEntity
    {

        [Column("INDEX_LIST_FIELD_ID")] public int IndexListFieldId { get; set; }
        [Column("TICKER")] public string Ticker { get; set; }
        [Column("INDEX_ID")] public int IndexId { get; set; }
        [Column("CCY_ID")] public int? CcyId { get; set; }
        [Column("CCY_CODE")] public string CcyCode { get; set; }
        [Column("FIELD_ID")] public int? FieldId { get; set; }
        [Column("FIELD_CODE")] public string FieldCode { get; set; }
        [Column("FIELD_NAME")] public string FieldName { get; set; }
        [Column("INDEX_NAME")] public string IndexName { get; set; }
        [Column("PRICE_DATE")] public DateTime PriceDate { get; set; }
        [Column("PRICE_DATE_ACTUAL")] public  DateTime PriceDateActual { get; set; }
        [Column("PRICE")] public int? Price { get; set; }
        [Column("MTD")] public int? Mtd { get; set; }
        [Column("MTD_MINUS_THREE")] public int? MtdMinusThree { get; set; }
        [Column("QTD")] public int? Qtd { get; set; }
        [Column("YTD")] public int? Ytd { get; set; }
        [Column("SI")] public  int? Si { get; set; }
    }

GetViewService

public IViewService<X> GetViewService<X>() where X : ViewEntity, new()
    {
        return IoC.Resolve<IViewService<X>>();
    }

IViewService中的where方法

 public IEnumerable<T> Where(Expression<Func<T, bool>> predicate)
        {
            try
            {
                using (new TimedLogger(_perfLogger, GetCompletedText("Where")))
                {
                    return Authorize(_repo.Where(predicate).ToList(), AuthAccessLevel.Read);
                }
            }
            catch (Exception ex)
            {
                _logger.Error(ex);
                throw;
            }
        }

1 个答案:

答案 0 :(得分:0)

即使这些值看起来像检查工具提示中的int?s,为了显示它们,VS也在评估/遍历您的匿名类型以获取要显示的实际值。

编译器需要在编译时构造一个执行相同操作的表达式,并且它将在表达式中包含类似的逻辑,以便可以在运行时执行该操作以获取值

然后,您将相同的谓词/表达式传递到您的存储库,在该存储库中,EF尝试从该表达式生成SQL,并且缺乏能够做到的复杂性(数据库模型将不了解您的匿名类型),因此,错误中有关无法“创建存储表达式”的部分(在这种情况下为SQL)。这只是对映射器的限制;它可以很好地管理简单的类型,但是会为此感到困扰。

如果将2个值复制到局部变量中并在谓词中使用它们,那应该没问题。