2009-07-19 4 views
1

Bonjour à tous Je vais avoir actuellement 2 numéros avec le code ci-dessous:vérification Var de requête LINQ est nulle et le retour des valeurs de plus de x

  1. Au retour de result1 je suis en train d'effectuer une vérification pour voir si elle est! = null et si elle ne l'est pas, elle commencera à supprimer les enregistrements sélectionnés. Le problème est que même si result1 ne renvoie rien et que l'instruction if ne le récupère pas par défaut, je suppose qu'il me manque quelque chose mais quoi? Je souhaite ne renvoyer que les valeurs qui datent de plus de 10 minutes (ce qui sera plus tard mis à l'échelle de 12 heures) pour ce faire. Je vérifie par rapport à a.DateTime qui est une valeur DateTime stockée dans une base de données. Cependant, si j'utilise les opérateurs < = ou> = cela ne fonctionne pas encore, qu'est-ce qui me manque?

    DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0)); 
    
    var result1 = (from a in cpuInfo 
            where a.DateTime <= dateTime 
            select a).DefaultIfEmpty(null); 
    
    if (result1 != null) 
    {    
        foreach (TblCPUInfo record1 in result1) 
        { 
          localDB.TblCPUInfo.DeleteOnSubmit(record1); 
          localDB.SubmitChanges(); 
        } 
    } 
    

Répondre

5

Philippe a parlé de la séquence des choses - même si vous n'avez même pas besoin de l'appel Any(). Après tout, s'il n'y a pas de changement, la boucle ne fera rien.

Souhaitez-vous vraiment soumettre les modifications à chaque itération? Il serait probablement plus logique de faire cela une fois à la fin. En outre, vous pouvez utiliser DateTime.AddMinutes pour simplifier le "10 minutes" initiales, et si vous filtrez uniquement par une clause Where, j'utiliserais la notation par points.

Après tous ces changements (et rendre les noms de variables plus utiles), le code ressemblerait à ceci:

DateTime tenMinutesAgo = DateTime.Now.AddMinutes(-10); 

var entriesToDelete = cpuInfo.Where(entry => entry.DateTime <= tenMinutesAgo); 

foreach (var entry in entriesToDelete) 
{ 
    localDB.TblCPUInfo.DeleteOnSubmit(entry); 
} 
localDB.SubmitChanges(); 

Maintenant, pour pourquoi < = ne fonctionne pas pour vous ... est-il possible que vous avez besoin de l'heure UTC au lieu de l'heure locale? Par exemple:

DateTime tenMinutesAgo = DateTime.UtcNow.AddMinutes(-10); 

Si cela ne fonctionne toujours pas, je vous suggère de jeter un oeil à la requête générée et de jouer avec elle dans un outil SQL (par exemple Enterprise Manager ou SQL Server Management Studio) pour comprendre pourquoi il ne retourne aucun résultat.

+0

@Jon: quel est l'avantage de l'heure UTC par rapport à l'heure locale? –

+0

Cela dépend de la base de données et des conversions. La situation exacte déterminera quel est le bon format à utiliser. –

3

DefaultIfEmpty retournera un seul élément avec le contenu que vous avez fourni, donc dans votre cas une collection avec une seule valeur « null ».

Vous devez vérifier les éléments de la collection à l'aide de la méthode d'extension Any(). Dans votre cas:

DateTime dateTime = DateTime.Now.Subtract(new TimeSpan(0, 0, 10, 0)); 

var result1 = from a in cpuInfo 
        where a.DateTime <= dateTime 
        select a; 

if (result1.Any()) 
{    
    foreach (TblCPUInfo record1 in result1) 
    { 
      localDB.TblCPUInfo.DeleteOnSubmit(record1); 
      localDB.SubmitChanges(); 
    } 
} 

Mais si cela est vraiment votre code, vous pouvez sauter le Tout() vérifier complètement, parce que la boucle foreach ne fonctionnera pas s'il n'y a aucun élément dans result1.