web-dev-qa-db-fra.com

Linq où la clause compare uniquement la valeur de date sans valeur de temps

var _My_ResetSet_Array = _DB
    .tbl_MyTable
    .Where(x => x.Active == true
        && x.DateTimeValueColumn <= DateTime.Now)
    .Select(x => x);

La requête supérieure fonctionne correctement.
Mais je veux vérifier uniquement la valeur de la date.
Mais date de vérification de la requête supérieure + valeur de l'heure.

En mssql traditionnel, je pourrais écrire une requête comme ci-dessous.

SELECT * FROM dbo.tbl_MyTable
WHERE 
CAST(CONVERT(CHAR(10), DateTimeValueColumn, 102) AS DATE) <= 
            CAST(CONVERT(CHAR(10),GETDATE(),102) AS DATE)
AND
Active = 1

Quelqu'un pourrait-il me suggérer comment vérifier la valeur de date dans Linq.

46
Frank Myat Thu

Il y a aussi EntityFunctions.TruncateTime ou DbFunctions.TruncateTime dans EF 6.0

95
Johann Blais

Solution de contournement simple à ce problème pour comparer la partie de date uniquement

var _My_ResetSet_Array = _DB
                    .tbl_MyTable
                    .Where(x => x.Active == true && 
                               x.DateTimeValueColumn.Year == DateTime.Now.Year
                            && x.DateTimeValueColumn.Month == DateTime.Now.Month
                            && x.DateTimeValueColumn.Day == DateTime.Now.Day);

Étant donné que le type de données 'Date' n'est pas pris en charge par linq to entity, où Année, Mois et Jour sont des types de données 'int' et sont pris en charge.

18
Pranay Rana
 result = from r in result where (r.Reserchflag == true && 
    (r.ResearchDate.Value.Date >= FromDate.Date && 
     r.ResearchDate.Value.Date <= ToDate.Date)) select r;
2
Jatin

MODIFIER

Pour éviter cette erreur: Le membre de type spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge.

var _My_ResetSet_Array = _DB
                .tbl_MyTable
                .Where(x => x.Active == true)
                         .Select(x => x).ToList();

 var filterdata = _My_ResetSet_Array
        .Where(x=>DateTime.Compare(x.DateTimeValueColumn.Date, DateTime.Now.Date)  <= 0 );

La deuxième ligne est obligatoire car LINQ to Entity ne peut pas convertir la propriété date en requête SQL. Il est donc préférable de récupérer d'abord les données, puis d'appliquer le filtre de date.

MODIFIER

Si vous voulez simplement comparer la valeur de date de la date et heure, utilisez 

DateTime.Date Property - Obtient le composant de date de cette instance.

Code pour vous 

var _My_ResetSet_Array = _DB
                .tbl_MyTable
                .Where(x => x.Active == true
     && DateTime.Compare(x.DateTimeValueColumn.Date, DateTime.Now.Date)  <= 0 )
                         .Select(x => x);

Si c'est comme ça, utilisez

DateTime.Compare, méthode - Compare deux instances de DateTime et renvoie un entier indiquant si la première instance est antérieure, identique ou ultérieure à la seconde instance.

Code pour vous 

var _My_ResetSet_Array = _DB
                .tbl_MyTable
                .Where(x => x.Active == true
                  && DateTime.Compare(x.DateTimeValueColumn, DateTime.Now)  <= 0 )
                         .Select(x => x);

Exemple 

DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
int result = DateTime.Compare(date1, date2);
string relationship;

if (result < 0)
   relationship = "is earlier than";
else if (result == 0)
   relationship = "is the same time as";         
else
   relationship = "is later than";
2
Pranay Rana

&& x.DateTimeValueColumn <= DateTime.Now

Ceci est supporté tant que votre schéma est correct

&& x.DateTimeValueColumn.Value.Date <=DateTime.Now
1
Joe Stellato

Dans un cas similaire, j'ai utilisé le code suivant:

DateTime upperBound = DateTime.Today.AddDays(1); // If today is October 9, then upperBound is set to 2012-10-10 00:00:00
return var _My_ResetSet_Array = _DB
    .tbl_MyTable
    .Where(x => x.Active == true
        && x.DateTimeValueColumn < upperBound) // Accepts all dates earlier than October 10, time of day doesn't matter here
    .Select(x => x);
1
takemyoxygen

Code de travail:

     {
        DataBaseEntity db = new DataBaseEntity (); //This is EF entity
        string dateCheck="5/21/2018";
        var list= db.tbl
        .where(x=>(x.DOE.Value.Month
              +"/"+x.DOE.Value.Day
              +"/"+x.DOE.Value.Year)
             .ToString()
             .Contains(dateCheck))
     }
0
Soharab Shaikh

Essaye ça,

var _My_ResetSet_Array = _DB
    .tbl_MyTable
    .Where(x => x.Active == true
         && x.DateTimeValueColumn <= DateTime.Now)
    .Select(x => x.DateTimeValueColumn)
    .AsEnumerable()
    .select(p=>p.DateTimeValueColumn.value.toString("YYYY-MMM-dd");
0
Karthic G