Linq to Entities实现DateTime.ToString(字符串)

Linq实体无法使用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。Linq to Entities实现DateTime.ToString(字符串)

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(“年月日”):

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块?

回答:

您正在要求提供者将呼叫DateTime.ToString(format)转换为不受支持的SQL。您可能还需要使用EntityFunctions.TruncateTime比较只有日期部分(因为这就是字符串比较会做):

你要么需要解析的关键日期/时间对象或传递一个IEnumerable<DateTime>代替:

protected override bool TryGetEntitiesByKey(IEnumerable<string> keys, out IEnumerable<Trade> entities) 

{

var keyDates = keys.Select(s => DateTime.ParseExact("yyyyMMdd")).ToList();

return this.TryLoadBase(x => keyDates.Contains(EntityFunctions.TruncateTime(x.date)), out entities);

}

以上是 Linq to Entities实现DateTime.ToString(字符串) 的全部内容, 来源链接: utcz.com/qa/266611.html

回到顶部