将datetime转换为LINQ to SQL查询中的格式化字符串

kan*_*oid 24 linq entity-framework linq-to-sql

我知道LINQ to SQL没有转换为SQL DateTime,string因为没有ToString().但是如何将其DateTime转换为格式化的字符串?

这是以下查询中需要帮助的行:

StartDate = string.Format("{0:dd.MM.yy}", p.StartDate)
Run Code Online (Sandbox Code Playgroud)

整个查询:

var offer = (from p in dc.CustomerOffer
             join q in dc.OffersInBranch
             on p.ID equals q.OfferID
             where q.BranchID == singleLoc.LocationID
             let value = (p.OriginalPrice - p.NewPrice) * 100 / p.OriginalPrice
             orderby value descending
             select new Offer()
             {
                 Title = p.OfferTitle,
                 Description = p.Description,
                 BestOffer = value,
                 ID = p.ID,
                 LocationID = q.BranchID,
                 LocationName = q.CustomerBranch.BranchName,
                 OriginalPrice = SqlFunctions.StringConvert((decimal)p.OriginalPrice),
                 NewPrice = SqlFunctions.StringConvert((decimal)p.NewPrice),
                 StartDate = string.Format("{0:dd.MM.yy}", p.StartDate)
             }).First();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

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

Alb*_*ano 29

另一种选择是使用SqlFunctions.DateName,你的代码将是这样的:

var offer = (from p in dc.CustomerOffer
                 join q in dc.OffersInBranch
                     on p.ID equals q.OfferID
                 where q.BranchID == singleLoc.LocationID
                 let value = (p.OriginalPrice - p.NewPrice) * 100 / p.OriginalPrice
                 orderby value descending
                 select new
                 {
                     Title = p.OfferTitle,
                     Description = p.Description,
                     BestOffer=value,
                     ID=p.ID,
                     LocationID=q.BranchID,
                     LocationName=q.CustomerBranch.BranchName,
                     OriginalPrice=SqlFunctions.StringConvert((decimal)p.OriginalPrice),
                     NewPrice=SqlFunctions.StringConvert((decimal)p.NewPrice),
                     StartDate= SqlFunctions.DateName("day",p.StartDate) + "/" + SqlFunctions.DateName("month",p.StartDate) + "/" +  SqlFunctions.DateName("year",p.StartDate)

                 })
Run Code Online (Sandbox Code Playgroud)

如果您不想添加额外的选择新块,我发现它很有用.


mcc*_*002 17

编辑:现在我明白了这个问题,我正在给它另一个镜头:)

var offer = (from p in dc.CustomerOffer
                     join q in dc.OffersInBranch
                         on p.ID equals q.OfferID
                     where q.BranchID == singleLoc.LocationID
                     let value = (p.OriginalPrice - p.NewPrice) * 100 / p.OriginalPrice
                     orderby value descending
                     select new
                     {
                         Title = p.OfferTitle,
                         Description = p.Description,
                         BestOffer=value,
                         ID=p.ID,
                         LocationID=q.BranchID,
                         LocationName=q.CustomerBranch.BranchName,
                         OriginalPrice=SqlFunctions.StringConvert((decimal)p.OriginalPrice),
                         NewPrice=SqlFunctions.StringConvert((decimal)p.NewPrice),
                         StartDate=p.StartDate

                     })
                     .ToList()
                     .Select(x => new Offer()
                     {
                         Title = x.OfferTitle,
                         Description = x.Description,
                         BestOffer=value,
                         ID=x.ID,
                         LocationID=x.BranchID,
                         LocationName=x.CustomerBranch.BranchName,
                         OriginalPrice=x.OriginalPrice,
                         NewPrice=x.NewPrice,
                         StartDate=x.StartDate.ToString("dd.MM.yy")
                     }).First();
Run Code Online (Sandbox Code Playgroud)

我知道它有点长,但这是Linq To SQL的问题.

使用linq时,在使用ToList()或First()等导致实际对象的内容之前,不会执行数据库调用.一旦第一个.first()调用执行了SQL调用,您现在正在使用.NET类型,并且可以使用DateTime.

  • 错误:LINQ to Entities无法识别方法'System.String ToString(System.String)',并且该方法无法转换为商店表达式。 (2认同)
  • 你应该替换第一个`First()`,呃,例如`Take(1)`得到一个`IEnumerable`用于后续的`Select`.或者把它留下来. (2认同)