实体框架4/Linq:如何在查询中将DateTime转换为字符串?

Zac*_*ott 23 linq-to-entities tostring entity-framework-4

我有以下查询:

from a in Products
select new ProductVM
    {
         id = a.id,
         modified = a.modified.ToString()
    }
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

LINQ to Entities does not recognize the method 'System.String ToString()'
method, and this method cannot be translated into a store expression.
Run Code Online (Sandbox Code Playgroud)

modified产品表的日期时间.将modified在ProductVM类是字符串.

有任何想法吗?这必须是一个微不足道的问题.

Zac*_*ott 44

这是另一种选择:

.Select( p -> SqlFunctions.StringConvert((double)
                  SqlFunctions.DatePart("m", p.modified)).Trim() + "/" +
              // SqlFunctions.DateName("mm", p.modified) + "/" + MS ERROR?
              SqlFunctions.DateName("dd", p.modified) + "/" +
              SqlFunctions.DateName("yyyy", p.modified)
Run Code Online (Sandbox Code Playgroud)

显然会DateName("MM", ..)拼出月份名称,在那里DatePart("mm", ..)提供一个数值,因此StringConvert( ),这个左边用空格填充结果,因此.Trim().

  • 这很棒!我需要执行此操作以使原始对象保持IQueryable。谢谢! (2认同)

Bro*_*ass 22

ToString()Linq to Entities不支持 - 有一个函数助手列表作为SqlFunctions的一部分,但这不支持Date到字符串转换.

最简单的将是第一个项目在查询中的匿名类型,然后强制转换为IEnumerableAsEnumerable()-之后,你可以用ToString(),因为你现在使用LINQ为查询表达式的其余部分对象(有关于这个主题的长篇文章在这里).

   var results = Products.Select( p => new { a.id, a.modified })
                         .AsEnumerable()
                         .Select(p => new ProductVM() 
                                { id = p.id, 
                                  modified = p.modified.ToString() 
                                });
Run Code Online (Sandbox Code Playgroud)

  • 这种方法很简单,但我不认为它适用于现实生活场景,因为这将遍历整个`Products`表.原始查询中的`Where`子句需要过滤日期值(转换为字符串),导致SQL查询会更糟. (5认同)
  • “关于此主题的冗长文章”链接似乎已损坏。:-( (2认同)