Belirtilen tür üyesi 'Tarih' LINQ to Entities'de desteklenmiyor. Yalnızca başlatıcılar, varlık üyeleri ve varlık gezinme özellikleri


138

Entity Framework bu kodu kullanarak aşağıdaki hatayı alıyorum. Belirli bir tarih için tüm satırları almak gerekir DateTimeStart, bu biçimde DataType türü2013-01-30 12:00:00.000

Kod:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

Hata:

base {System.SystemException} = {"Belirtilen tür üyesi 'Tarih' LINQ to Entities'de desteklenmiyor. Yalnızca başlatıcılar, varlık üyeleri ve varlık gezinme özellikleri desteklenir."}

Bunun nasıl tamir edileceğine dair fikri olan?


EF Core 2.1.1'de x.DateTimeStart.Date'i kullanabiliyorum
Kirsten Greed

Yanıtlar:


271

DateTime.DateSQL'e dönüştürülemez. Tarih bölümünü almak için EntityFunctions.TruncateTime yöntemini kullanın .

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

GÜNCELLEME: @shankbond'un yorumlarda belirtildiği gibi, Entity Framework 6'da EntityFunctionsgeçersizdir ve DbFunctionsEntity Framework ile birlikte gönderilen sınıfı kullanmalısınız .


1
Sürümünüzü hafifçe değiştirmek zorundayım. Nerede (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); bana thougs bildirin
GibboK

1
Umarım eğer cevap verirseniz .date ekleyerek cevabınızı düzenlediğimi umursamıyorsunuz, bu yüzden sadece referans için :-) Desteğiniz için teşekkürler, gerçekten takdir ediyorum
GibboK

1
@GibboK emin, sorun değil :) Bu sadece uzun dize biçimlendirme amaçlıydı.
Sergey Berezovskiy

68
EntityFunctions eski, DbFunctions.TruncateTime yöntemini kullanın
shankbond

1
Belirtilen tür üyesi 'Tarih' LINQ to Entities'de desteklenmiyor. Yalnızca başlatıcılar, varlık üyeleri ve varlık gezinme özellikleri desteklenir.
SAR

84

Şimdi kullanmalısın DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


Belirtilen tür üyesi 'Tarih' LINQ to Entities'de desteklenmiyor. Yalnızca başlatıcılar, varlık üyeleri ve varlık gezinme özellikleri desteklenir.
SAR

17

Varlık çerçevesinde bu sorunu çözmeme yardımcı olan bir çözüm eklemek istiyorum:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

Umarım yardımcı olur.


15

EntityFunctionseski. DbFunctionsBunun yerine kullanmayı düşünün .

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

8

Hem x.DateTimeStart hem de currentDate için her zaman EntityFunctions.TruncateTime () öğesini kullanın. gibi :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));

5

Sadece basit özellikleri kullanın.

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

Uygulamanızda gelecekteki tarihler mümkün değilse > = x.DateTimeStart> = currentDateTime.Date yeterlidir.

daha karmaşık tarih karşılaştırmaları varsa, Canonical işlevlerini kontrol edin ve EF6 + DB işlevleriniz varsa

Daha Genel - Sorun arayan kişiler için EF'de desteklenen Linq yöntemleri , Bellek tabanı Listelerinde çalışan ancak EF'de olmayan linq deyimleriyle benzer sorunları açıklayabilir.


3

Basitleştirilmiş:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();

2

EF6'yı kullanmak için feryat kodunu kullanın:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

0

Başka bir çözüm şunlar olabilir:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.