2009-08-04 13 views
14

Piszę ten kod. Tutaj dt jest wprowadzane do funkcji, jak również someint. Kolumna Exp jest kolumną z datą T-SQL, która przychodzi jako DateTime przez Linq.Jak dodać dzień na dzień w Linq do SQL

return (from a in dataContext.TableOfA 
     where a.name == "Test" && 
     a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
     select a).First(); 

W języku C# można dodać datę podwójną jako dzień. Oznacza to, że możesz dodać 1,5 dnia. W T-SQL można dodać tylko 1 dzień, a następnie 12 godzin. Musisz dodać int dla każdej części. Więc kiedy Linq tłumaczy AddDays na T-SQL, konwertuje moją liczbę dni na milisekundy i dodaje je. Pozwala to na podanie dokładności, którą podwójny daje C#.

Oto rub. Gdy dojdzie do SQL, pojawia się błąd:

The datepart millisecond is not supported by date function dateadd for data type date

Zasadniczo nie można dodać milisekund do daty. Nie żartuję. Ale jak uzyskać coś, co tutaj tłumaczy? Chcę dodać dni do daty. Czy jedyny chcesz to zrobić, aby dodać negatywny wynik do drugiego faceta, z którym się porównywałem? Co jeśli chciałbym porównać z kolumnami podczas dodawania do jednego?

Aktualizacja 1

Keith wrote, A command like datepart(millisecond, 10000, myDate) has been supported in T-SQL since at least SQL Server 2000. This error suggests that whatever database you are using does not support the millisecond date part, which seems strange to me.

Uwaga używam SQL Server 2008. To nie jest obsługiwana od typu danych DATA. Jest obsługiwany na podstawie datetime.

+0

Polecenie jak DatePart (milisekundy, 10000, MyDate) została poparta w T-SQL, ponieważ co najmniej SQL Server 2000. Błąd ten sugeruje, że cokolwiek w bazie używasz nie obsługuje część datę milisekundy, co wydaje mi się dziwne . – Keith

+0

Nie jest obsługiwany w typie danych DATE. Jest obsługiwany na podstawie datetime. –

+0

To ma więcej sensu. Jeśli masz kontrolę nad projektem DB, prostym rozwiązaniem będzie zmiana tej kolumny z DATE na DATETIME. Oczywiście, jeśli zadajesz to pytanie, to nie jest to coś, nad czym masz kontrolę? – Keith

Odpowiedz

4

Właśnie zmieniłem kolumnę z powrotem na DateTime.

0

Czy rozważałeś napisanie własnej funkcji zdefiniowanej przez użytkownika, która zasadniczo przyjmuje int (na liczbę dni) i datę, zwraca wyniki dateadd()? Następnie przenieś to do klasy LINQ w swoim projekcie. Następnie, zamiast wywoływać funkcję .AddDate(), wywołaj swój UDF - pozwoli ci to zachować wszystko w kwerendzie LINQ bez konieczności ręcznego składania razem polecenia SQLC.

6

Jeśli używasz Entity Framework, użyj System.Data.Objects.EntityFunctions jak poniżej:

c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1) 
3

można przenieść rozmowę do AddDays od części SQL do części .NET:

a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint)) 
4

wydaje się, że scenariusz ten jest przeważnie ustalona w .NET 4.5.

Jednak jeśli piszesz:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.Date.AddDays(7) select p; 

dostaniesz ten sam komunikat o błędzie, jak opisano w PO.

Ale jeśli piszesz:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.AddDays(7) select p; 

Następnie można przejść do krainy mlekiem i miodem. Zauważ, że nie zadzwoniłem. Data na reprezentacji DateTime bazy danych. Wydaje się, że jest to skrajny przypadek, w którym brakuje zasięgu testowego w ramach SQL LINQ 2 w wersji 4.5

+4

Używam .NET 4.5.1 i oba scenariusze, które dostarczyły mi błąd "nie obsługiwany przez LINQ" – mgrenier

3

Utwórz nowy DateTime obiekt i użyć AddDays metodę po tym:

new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx) 
-2

może być dobrym pomysłem, jeśli byś najpierw zmienić zapytanie SQL do Linq i LINQ kwerendy proces.

Wystarczy dodać ToList() lub ograniczyć rekord

return (from a in dataContext.TableOfA.ToList() 
    where a.name == "Test" && 
    a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) 
    select a).First(); 

Więc skoro masz wszystkie swoje rzeczy w LINQ to można przetwarzać więcej effectivly myślę.

Cheers

0

można użyć: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays) Ta funkcja zostanie przetłumaczony na poprawne zapytanie SQL. Klasa System.Data.Entity.Core.Objects.EntityFunctions, która zawiera również funkcję AddDays, jest przestarzała.