代码之家  ›  专栏  ›  技术社区  ›  Tom

LINQ to Entities无法识别方法“<>f庀AnonymousType9`2[系统。可为空`1个[系统.Int32],系统。可为空`

  •  0
  • Tom  · 技术社区  · 6 年前

    在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.'
    

    我拿到身份证的第一步

    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;
                }
            }
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   sellotape    6 年前

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

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

    然后,将同一谓词/表达式传递到存储库,在存储库中,EF尝试从表达式生成SQL,但缺乏能够这样做的复杂性(数据库模型将不知道您的匿名类型),因此出现了无法创建存储表达式(在本例中为SQL)的错误。这只是mapper的一个限制;它可以很好地管理简单类型,但会与之斗争。

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