Instancier vide IQueryable pour une utilisation avec Linq to sql

j'ai besoin de pouvoir soit avoir un paramètre optionnel dans une requête Linq, soit être capable d'assigner la requête à un var dans quelque chose comme un SI SI si ce paramètre optionnel doit être supprimé de la requête.

si je place la requête var à l'intérieur de la déclaration IF, alors elle me dit que la var n'existe pas en contexte quand j'essaie de la boucler.

if (whichGroup == "All")
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  );
        }
        else
        {
            var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr && o.Group == whichGroup
                                   select o
                                  );
        }

        foreach (var data in listOppLineData)  //listOppLineData doesn't exist here
        {

j'ai besoin de mettre le var avant la déclaration de si je pense, mais je ne sais pas à quoi le mettre.

var listOppLineData = ""; // gives me 
Cannot implicitly convert type 'System.Linq.IQueryable<Forecast.Models.opportunity_vw>' to 'string'

IQueryable listOppLineData = new IQueryable(); //gives me
        Cannot create an instance of the abstract class or interface 'System.Linq.IQueryable'
36
demandé sur tereško 2013-02-21 05:24:10

4 réponses

essaye ceci:

IQueryable<opportunity_vw> listOppLineData;

Ceci définit la variable, mais vous attendez de l'initialiser.

Aussi, en regardant votre requête, vous pouvez faire tout en un, comme suit:

var listOppLineData = (from o in db.opportunity_vws
                      where o.fiscal_yr_and_qtr == qtr && (o.Group == whichGroup || whichGroup == "All")
                      select o
                      );
16
répondu Simon C 2013-02-21 01:31:04

Essayez ceci. Vous pouvez créer un type générique avec ou un type spécifique en remplaçant avec votre nom de type.

IQueryable listOppLineData = Enumerable.Empty<T>().AsQueryable()
83
répondu Krishna 2015-04-03 10:52:43

votre problème est que lorsque vous déclarez une variable dans C#, vous la déclarez seulement dans la portée actuelle. Donc, si vous déclarez la variable listOppLineData dans le if bloc, vous pouvez l'utiliser uniquement à l'intérieur de ce bloc, mais pas n'importe où ailleurs. (Vous pouvez définir une autre variable avec le même nom dans un autre bloc, mais ce serait une variable complètement différente, donc elle n'aurait pas la valeur que vous avez assignée à la première variable.)

Comme vous l'avez déjà compris, vous devez déclarer l' variable en dehors de la if blocs.

votre première tentative n'a pas fonctionné, parce que le compilateur a vu que vous n'avez pas spécifié explicitement le type de la variable (c'est ce que var does) et vous avez assigné un string à la variable. Il en déduit que le type de la variable est string. Et vous ne pouvez pas assigner quelque chose qui n'est pas un string à une telle variable.

votre deuxième tentative n'a pas fonctionné, parce que vous ne pouvez pas créer une instance d'une interface. (Si vous voulez créer une instance, il faut qu'un certain type spécifique, généralement une classe.) Et même si tu le fixe, le non-générique IQueryable ne sait pas le type d'articles en elle, donc le foreach ne fonctionnerait pas bien.

mais vous n'avez pas besoin d'attribuer de valeur à la variable, puisqu'elle est assignée dans les deux branches de la if. Et le type correct ici, c'est le générique IQueryable<T>T étant opportunity_vw. Cela signifie que le code correct est:

IQueryable<opportunity_vw> listOppLineData;

if (whichGroup == "All")
{
    listOppLineData = …;
}
else
{
    listOppLineData = …;
}

foreach (var data in listOppLineData)
{
    …
}

si vous avez vraiment voulu attribuez une valeur à la variable (bien qu'il n'y ait aucune raison de le faire ici), vous pouvez utiliser null (qui représente aucune valeur):

IQueryable<opportunity_vw> listOppLineData = null;
5
répondu svick 2013-02-21 02:14:39

Essayez d'ajouter .ToList ();

var listOppLineData = (from o in db.opportunity_vws
                                   where o.fiscal_yr_and_qtr == qtr
                                   select o
                                  ).ToList();

mise à Jour

et corriger la requête.

Vous n'aurez rien à itérer sur sans .ToList ();

Tête de Cul de mise à Jour

var listOppLineData = (from o in db.opportunity_vws
                      where (whichGroup == "All" || o.Group == whichGroup)
                      && (o.fiscal_yr_and_qtr == qtr)
                      select o);

mettez votre 'short' avant le bloc, alors la seconde partie n'est jamais évaluée si elle n'est pas nécessaire. J'ai toujours utiliser le .ToList() though.

0
répondu Trey Gramann 2013-02-21 02:21:15