2013-09-26 119 views
5

Tôi có một Linq Kết quả mà từ đó tôi chỉ cần chọn Date từ DateTime.
My Query đi như thế này:LINQ - Chọn ngày từ DateTime

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

là có thể? Bất kỳ trợ giúp nào sẽ được đánh giá cao.

CREATED_DATE - `datetime` datatype 

Thực ra, tôi đang Ràng buộc nó vào một điều khiển như một DataSource và điều khiển được hiển thị cả Date and Time .Nhưng tôi muốn chỉ hiển thị date.

Khi tôi đang cố gắng với CREATED_DATE = xx.CREATED_DATE.Value.Date, Nó được đưa ra một lỗi như:

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

+1

Và vấn đề là gì? – I4V

+0

xx.CREATED_DATE.ToShortDateString()? Định dạng CREATED_DATE là gì? – andrewb

Trả lời

15

Nếu mục đích cho mục đích thuyết trình, bạn có thể sử dụng thuộc tính DataFormatString. Ví dụ, nếu bạn đang ràng buộc một nguồn dữ liệu vào GridView, bạn có thể làm như;

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

Bạn có thể sử dụng EntityFunctions.TruncateTime() để trả về ngày nhập không có phần thời gian.

EntityFunctions.TruncateTime(xx.CREATED_DATE) 

Truy vấn của bạn sẽ giống như;

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 để nhận biết vấn đề XY. – Aron

+5

Trong các phiên bản mới hơn của Entity Framework, 'EntityFunctions' đã được thay thế bằng' DbFunctions'. –

-1

Có lẽ điều này?

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

Nó không có bất kỳ tài sản như '.Date'. Nó chỉ có thuộc tính như '.Value.Date' và điều đó không hoạt động và đưa ra một lỗi như: Thành viên loại được chỉ định 'Ngày' không được hỗ trợ trong LINQ to Entities. Chỉ các trình khởi tạo, thành viên thực thể và thuộc tính điều hướng thực thể mới được hỗ trợ. – RealSteel

+0

@RealSteel Điều này, nên làm việc nếu bạn làm theo nó hoàn toàn. Lý do là cuộc gọi '.Date' đang chạy trong LINQ to Object hơn là LINQ to Entities. Vẫn. Nó không phải là giải pháp ưa thích của tôi. – Aron

+1

@Aron Nó cũng không phải là giải pháp ưa thích của tôi. Nếu giá trị thu được cho mục đích hiển thị tôi thậm chí sẽ không quan tâm để làm cho nó một ngày từ bên trong các truy vấn ở tất cả. Kiểm soát phải có một FormatString cho giá trị hiển thị. – 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

Nội dung truy vấn phải kết thúc bằng mệnh đề chọn hoặc mệnh đề nhóm – RealSteel

+0

@RealSteel Trả lời Cập nhật – Damith