2011-11-03 10 views
13

So che LINQ to SQL non converte DateTime in string poiché non vi è ToString() in SQL. Ma come posso convertire lo DateTime in una stringa formattata?Convertire data/ora in una stringa formattata all'interno di una query LINQ su SQL

Questa è la linea nel seguente query che ha bisogno di aiuto:

StartDate = string.Format("{0:dd.MM.yy}", p.StartDate) 

Tutta la query:

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(); 

ottengo il seguente messaggio di errore:

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

risposta

10

EDIT: Ora che capisco la domanda, sto dando un altro colpo :)

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(); 

So che è un po 'lungo, ma questo è il problema con Linq To SQL.

Quando si utilizza linq, la chiamata al database non viene eseguita finché non si utilizza qualcosa come ToList() o First() che restituisce oggetti reali. Una volta che la chiamata SQL viene eseguita dalla prima chiamata .First(), ora si sta lavorando con i tipi .NET e si può usare la roba DateTime.

+0

Errore: LINQ to Entities non riconosce il metodo "System.String ToString (System.String)" e questo metodo non può essere convertito in un'espressione di archivio. – kandroid

+0

Quindi p.StartDate è un DateTime o una stringa? – mccow002

+0

p.startdate -is datetime – kandroid

0

se è un datetime è necessario utilizzare il .ToShortDateString(). Ma devi anche dichiararlo AsEnumerable().

var offer = (from p in dc.CustomerOffer.AsEnumerable() 
       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.ToShortDateString() 
       }).First(); 
21

Un'altra opzione sta utilizzando SqlFunctions.DateName, il codice sarà simile a questo:

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) 

       }) 

ho trovato utile se non si desidera aggiungere un extra di selezionare nuovo blocco.

+0

Ho dovuto aggiungere questo usando: 'using System.Data.Objects.SqlClient;' per usare 'SqlFunctions' – Kristopher

+0

Aggiungi riferimento a System.Data.Entity.dll se prima non usi sqlfunctions – Rama

0

che è quello che abbiamo fatto, abbiamo aggiunto una nuova funzione alla classe e interroghiamo la data come normale nella query:

[ComplexType] 
public class Offer 
{  
    public DateTime StartDate 
    { 
     get; 
     set; 
    } 

    public String Title 
    { 
     get; 
     set; 
    } 

    /*Other fields*/  
    . 
    . 
    . 


    public string FormattedDate(string format) 
    { 
     return Date.ToString(format); 
    } 
} 



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 = p.StartDate 
     }).First(); 

Poi si può chiamare il campo FormattedDate passando il formato desiderato.

edit1.Text = offer.FormattedDate("dd.MM.yy"); 

O può può definirlo come un campo con solo il getter:

public string FormattedDate 
       { 
        get { return Date.ToString("dd.MM.yy") }; 
       } 

edit1.Text = offer.FormattedDate; 

Nel caso in cui classe è un'entità, è necessario dichiarare un nuovo parziale di quella classe e aggiungere il campo.

Spero che questo aiuti qualcuno.

Problemi correlati