2013-09-26 14 views
5

Mam Linq Wynik, z którego muszę wybrać tylko Date z DateTime.
moje pytanie brzmi tak:Linq - Wybierz datę z DataTime

var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE 
        where xx.USER_ID == userid && xx.IS_ACTIVE == 1 
        select new 
        { 
         xx.TEMPLATE_ID, 
         xx.TEMPLATE_NAME, 
         //CREATED_DATE = xx.CREATED_DATE.Value.Date 
         //CREATED_DATE = EntityFunctions.TruncateTime(xx.CREATED_DATE) 
         xx.CREATED_DATE 
        }).ToList(); 

to możliwe? Każda pomoc będzie bardzo ceniona.

CREATED_DATE - `datetime` datatype 

Właściwie mam wiążącą go do kontroli jako DataSource i sterowanie jest wyświetlanie zarówno Date and Time .Ale chcę tylko date wyświetlić.

Kiedy próbuję z CREATED_DATE = xx.CREATED_DATE.Value.Date, to daje błąd jak:

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

+1

A jaki jest problem? – I4V

+0

xx.CREATED_DATE.ToShortDateString()? W jakim formacie jest CREATED_DATE? – andrewb

Odpowiedz

15

Jeśli jest to przeznaczone do prezentacji, można użyć właściwości DataFormatString. Na przykład, jeśli wiążesz źródło danych z GridView, możesz zrobić to jako;

<asp:BoundField DataField="CREATED_DATE" ... 
    DataFormatString="{0:d}" ../> 

Else można użyć EntityFunctions.TruncateTime() która zwraca datę wejścia bez części czasu.

EntityFunctions.TruncateTime(xx.CREATED_DATE) 

Twoje zapytanie będzie podobne;

var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE 
        where xx.USER_ID == userid && xx.IS_ACTIVE == 1 
        select new 
        { 
         xx.TEMPLATE_ID, 
         xx.TEMPLATE_NAME, 
         EntityFunctions.TruncateTime(xx.CREATED_DATE) //new like 
        }).ToList(); 
+0

+1 za rozpoznanie problemu XY. – Aron

+5

W nowszych wersjach Entity Framework, 'EntityFunctions' został zastąpiony przez' DbFunctions'. –

-1

może ten?

var qry = (from xx in VDC.SURVEY_TEMPLATE 
      where xx.USER_ID == userid && xx.IS_ACTIVE == 1 
      select new { xx.TEMPLATE_ID, xx.TEMPLATE_NAME, xx.xx.CREATED_DATE }); 

var UserTemplates = qry.AsEnumerable().Select(xx => new 
        { 
         xx.TEMPLATE_ID, 
         xx.TEMPLATE_NAME, 
         xx.CREATED_DATE.Value.Date 
        }).ToList(); 
+0

Nie ma żadnej właściwości, takiej jak ".Date". Ma tylko taką właściwość jak ".Value.Date", która nie działa i podaje błąd w rodzaju: Podany element typu "Data" nie jest obsługiwany w LINQ do jednostek. Obsługiwane są tylko inicjatory, elementy encji i właściwości nawigacji jednostki. – RealSteel

+0

@RealSteel To powinno działać, jeśli podążysz za nim całkowicie. Powodem jest to, że wywołanie '.Date' działa w Linq do Object, a nie w Linq do Entities. Nadal. To nie jest moje preferowane rozwiązanie. – Aron

+1

@Aron To także nie jest moje preferowane rozwiązanie. Jeśli wartość została uzyskana dla celów wyświetlania, nie chciałbym nawet w ogóle wprowadzić daty z kwerendy. Kontrolka powinna mieć FormatString dla wyświetlanej wartości. – Dbuggy

0
var UserTemplates = (from xx in VDC.SURVEY_TEMPLATE 
        where xx.USER_ID == userid && xx.IS_ACTIVE == 1 select xx).AsEnumerable() 
        .Select(i=> new 
        { 
         i.TEMPLATE_ID, 
         i.TEMPLATE_NAME, 
         CREATED_DATE = i.CREATED_DATE.ToString("M/d/yyyy"), 
         i.CREATED_DATE 
        }).ToList(); 
+0

Treść zapytania musi kończyć się klauzulą ​​wyboru lub klauzulą ​​grupy – RealSteel

+0

@RealSteel Answer Updated – Damith