使用Linq to Entities

时间:2017-12-27 17:29:02

标签: c# entity-framework linq

有没有办法解决Linq to Entities无法使用DateTime.ToString(string)方法的问题?使用下面的方法抛出异常LINQ to Entities does not recognize the method 'System.DateTime ToString(System.String)' method, and this method cannot be translated into a store expression.,这是预期的,因为它无法转换为sql。

protected override bool TryGetEntitiesByKey(IEnumerable<string> keys, out IEnumerable<Trade> entities)
{
  return this.TryLoadBase(x => keys.ToList().Contains(x.date.ToString("yyyyMMdd"), out entities);
}

通用提供程序中的代码(使用func来过滤db的结果)在下面。

protected virtual bool TryLoadBase(Expression<Func<TEntity, bool>> filter, out IEnumerable<TEntity> entities)
{
  bool loaded = true;
  try
  {
    using (var db = this.dbContext)
    {
      entities = db.Set<TEntity>().Where(filter).ToList();
    }
  }
  catch (Exception ex) // Exception caught here
  {
    loaded = false;
    entities = new List<TEntity>();
  }
  return loaded;
}

在收到前面提到的异常后,我尝试用这个替换date.ToString(&#34; yyyyMMdd&#34;):

SqlFunctions.StringConvert((double)notional.date.Year).Trim() +
SqlFunctions.Replicate("0", 2 - SqlFunctions.StringConvert((double)notional.date.Month).Trim().Length) + SqlFunctions.StringConvert((double)notional.date.Month).Trim() +
SqlFunctions.Replicate("0", 2 - SqlFunctions.StringConvert((double)notional.date.Day).Trim().Length) + SqlFunctions.StringConvert((double)notional.date.Day).Trim()

虽然这是有效的,但它必须是内联的,否则您会得到关于LINQ to Entities无法识别该方法的相同消息。这意味着它更难以阅读,并且不能被其他任何东西重复使用。

环顾四周之后,我发现了这个问题:( Reusable Calculations For LINQ Projections In Entity Framework)但我不愿意包含任何外部软件包来解决这个问题。

Entity Framework 4 / Linq: How to convert from DateTime to string in a query?上也有答案,但据我所知,使用AsEnumerable()就像在接受的答案中那样意味着将数据库集枚举到内存中,由于内存的原因我无法做到这一点限制。而且我无法得到第二个正常工作的答案,它将再次遭受上面SqlFunctions混乱的问题。

如果这根本不可能,那么任何人都可以提供更简洁的SqlFunctions块替代方案吗?

1 个答案:

答案 0 :(得分:1)

您要求提供商将调用const转换为SQL,这是不受支持的。您可能还需要使用const Color(0xFF00CCFF)来仅比较日期部分(因为这是字符串比较的作用):

您需要将密钥解析为日期/时间对象,或者传递const代替:

DateTime.ToString(format)