在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);
该模型用于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 :(得分:0)
即使这些值看起来像检查工具提示中的int?s,为了显示它们,VS也在评估/遍历您的匿名类型以获取要显示的实际值。
编译器需要在编译时构造一个执行相同操作的表达式,并且它将在表达式中包含类似的逻辑,以便可以在运行时执行该操作以获取值
然后,您将相同的谓词/表达式传递到您的存储库,在该存储库中,EF尝试从该表达式生成SQL,并且缺乏能够做到的复杂性(数据库模型将不了解您的匿名类型),因此,错误中有关无法“创建存储表达式”的部分(在这种情况下为SQL)。这只是对映射器的限制;它可以很好地管理简单的类型,但是会为此感到困扰。
如果将2个值复制到局部变量中并在谓词中使用它们,那应该没问题。