2013-02-08 10 views
9

ich nur in einer Linq-Abfrage nur das Datum vergleichen muß, die ein datetime Feld beinhaltet. Jedoch führt die Syntax unten in der folgenden FehlermeldungVerwenden Linq Abfrage Datum vergleichen nur mit Datetime-Feld

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

Wer weiß, wie aus einem datetime Feld nur das Datum zu extrahieren?

var duplicate = from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       a.DateTaken.Date == course.DateTaken.Date && 
       a.SymNumber == symNumber 
       select a; 

Antwort

14

Es könnte ein wenig Kreisverkehr scheinen, aber Sie können, dies zu tun, die SqlFunctions Klasse DateDiff Methode verwenden. Geben Sie einfach beide Werte ein und verwenden Sie "Tag", um den Unterschied zwischen ihnen in Tagen zu finden (der am selben Tag 0 sein sollte).

wie folgt aus:

from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       SqlFunctions.DateDiff("DAY", a.DateTaken, course.DateTaken) == 0 && 
       a.SymNumber == symNumber 
       select a; 
+0

Wäre das nicht der Unterschied gleich Null sein, wenn die Daten, zu verschiedenen Zeitpunkten, sind aber in weniger als einem Tag Abstand, sagen wir, 'Jan-5, 2013 23: 30: 00 'und' Jan-6, 2013 01.30: 00'? – dasblinkenlight

+0

Ich glaube nicht: http://www.sqlteam.com/article/datediff-funktion-demystified – IronMan84

+1

Danke für den Link! – dasblinkenlight

1

versuchen, diese

DateTime dt =course.DateTaken.Date; 
var duplicate = from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       a.DateTaken == dt && 
       a.SymNumber == symNumber 
       select a; 

wenn a.DateTaken Zeit auch enthält, dann diese Links verweisen auf Ihrem Datum zu ändern.
Die Date-Eigenschaft kann nicht in LINQ To Entities verwendet werden.

Compare Dates using LINQ to Entities (Entity Framework)

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

http://forums.asp.net/t/1793337.aspx/1

9

Sie können EntityFunctions.TruncateTime() unter dem Namespace System.Data.Objects

Ex verwenden.

db.Orders.Where(i => EntityFunctions.TruncateTime(i.OrderFinishDate) == EntityFunctions.TruncateTime(dtBillDate) && i.Status == "B") 

Funktioniert wie Charme.

+0

Wird in Entity Framework nicht unterstützt. –

+0

Hey @AlexAngas, Sie können überprüfen, ob dies in EF4 funktioniert. Welche Version verwendest du? –

+0

Ich benutzte EF5 und habe diese Ausnahme: 'System.NotSupportedException: Diese Funktion kann nur von LINQ to Entities aufgerufen werden. bei System.Data.Objects.EntityFunctions.TruncateTime (Nullable'1 dateValue) '. Gibt es etwas, das ich vermisse? –

6

Sie können es wie unten tun:

var data1 = context.t_quoted_value.Where(x => x.region_name == "Pakistan" 
         && x.price_date.Value.Year == dt.Year 
         && x.price_date.Value.Month == dt.Month 
         && x.price_date.Value.Day == dt.Day).ToList(); 
-1

die .Date Take off Wenn das Feld ein Datetime ist, kann es mit ==

var duplicate = from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       a.DateTaken == course.DateTaken && 
       a.SymNumber == symNumber 
       select a; 
3

Sie System.Data.Entity.DbFunctions.TruncateTime

verwenden müssen verglichen werden