2009-02-20 21 views
55

LityQ with Entity Framework kullanarak 2 tarih arasındaki gün sayısını belirlemeye çalışıyorum. Bu, System.TimeSpan sınıfıLINQ to varsayı 2 tarihi çıkarmak için

'daki Çıkarmayı tanımadığını bildiriyor. İşte LINQ sorgusunun nerede olduğunu bulamıyorum. İşte

where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays)) 

Ben

{ "varlıkları için LINQ yöntemi 'System.TimeSpan Çıkar (System.DateTime)' tanımıyor yöntem VS.NET ayıklayıcısında aldığınız hata olduğunu ve bu yöntem bir mağaza ifadesine çevrilemez. "}

Yanlış bir şey yapıyorum ya da varlık çerçevesindeki 2 DateTime arasında gün sayısını elde etmenin daha iyi bir yolu var mı? yüklem bir ifade ağacına çevrilecek gerektiğinden

sayesinde Michael

+0

Ben de mamayı biraz değiştirerek zaman aralığını uzak durmaya aşağıdaki - hala çalışmıyorsa hangi nerede (vid.CreatedDate.AddDays (maxAgeInDays)> = DateTime.Now) –

cevap

41

olduğunu Bir çekicilik gibi çalıştı - teşekkürler Micah bana ifade ağacı hakkında düşünmeye başladığın için teşekkürler

+2

Yanıt olarak @Micah işaretini işaretlemeli ve yanıtına yorum eklemeli veya sorunuzu son yanıtla güncellemelisiniz. – ongle

+0

Zeki, akıllı zeki. Basit ve düz ileri. Hala neden ilk başta bana gelmediğini merak ediyorum. –

11

Sen isses bu tür girmek. Ve çeviri işlemi DateTime.Now.Subtract yöntemini tanımıyor. Ben

DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0)); 
... 

sonra LINQ sorgusu

where (vid.CreatedDate >= oldestDate) 

arasında nerede kısmını modifiye eski tarihini temsil eden bir datetime değişken tanımlanmış

işe aldım nasıl İşte

+0

ne yapacağını zaten var Bir ifade ağacına dönüştürülebilmem için yapmaya çalışıyorum? –

1

Gerçek şu ki tasarım gereği, LINQ to Entities'in tüm sorguyu SQL deyimlerine çevirmesi gerekiyor. Subtract yöntemini tanıyamaz. Bir sorgu içinde C#/VB yöntemi kullanmaya çalıştığınızda ortaya çıkar. Bu gibi durumlarda, bu bölümü sorgudan çıkarmanın bir yolunu bulmalısınız. http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx

+0

'u paylaştığınız için teşekkürler. Bu cevap doğru ama istediğim cevap kesinlikle değil. LINQ to SQL, dışardaki yöntemleri sizin istediğiniz kadar desteklemeyi destekledi, bu yüzden bu ticaret-talihsiz bir durum. –

+2

bağlantı kesildi. – Bijan

90

kabul cevabı bu durumda daha iyi, ama başvuru için başka şeylerin yanı sıra, tarihlerde işlemleri gerçekleştirmek için EntityFunctions sınıfını kullanabilirsiniz: Bu mesaj biraz daha açıklar.

where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay)) 
+0

Teşekkürler, tam olarak aradığım şey bu. – wdanda

+3

Bunun yalnızca Entity Framework v4'te desteklendiğini unutmayın. Bu, Entity Framework v1 için çalışmaz. –

+0

EntityFunctions sınıfını paylaştığınız için teşekkür ederiz. Çok yararlı – StackThis

18

Ayrıca System.Data.Objects.EntityFucntions kullanabilirsiniz: EntityFunctions den

currentDate = DateTime.Now; 

... 
where EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays 

Tüm fonksiyonlar sadece Linq varlıklar için geçerlidir, SQL fonksiyonları eşlenir.

+0

Onlar da varlıkları Linq için çalışıyorum. –

+0

@Morten: Bu türdeydi, sadece Linq-to-entities ile çalışıyorlar. –

+0

Birçok SQL Server'a özgü işlevler 'System.Data.Objects.SqlClient.SqlFunctions' sınıfı üzerinden kullanılabilir. Tabii ki, veri deposu bunun çalışması için bir SQL Server olmalıdır. Daha fazla bilgi için: http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.aspx – bernhof

0

Sen modelinde yeni özellik tanımlayabilir:

public DateTime StartDate{ get; set; } 
    public DateTime EndDate{ get; set; } 
    public TimeSpan CalculateTime{ 
     get 
     { 
      return EndDate.Subtract(StartDate); 
     } 
    } 

Şimdi, böyle bir şey kullanabilirsiniz: Eğer sonuca baktığımızda, aşağıdaki gibi geri dönüşü kullanabilir

var query = from temp in db.Table 
select new MyModel { 
    Id = temp.Id, 
    Variable1 = temp.Variable1, 
    ... 
    EndDate = temp.EndDate, 
    StartDate = temp.StartDate 
} 

:

return query 

Şimdi, sorguda, biz CalculateTime (BitişTarihi ve startDate arasında çıkarma) var.