3 votes

utilisation de variables dans une requête linq dynamique

J'utilise Linq to Entities et j'ai ajouté la stmt using de using System.Linq.Dynamic; Mon objectif est de passer dans le whereClause dans la requête emailList (voir la capture d'écran).

Des idées ?

Error message details

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Après avoir utilisé la suggestion de @Michael, j'ai réussi à le faire fonctionner avec ce qui suit :

HTML (remarquez que j'ai placé la valeur du champ dans l'attr. 'Value') :

<asp:CheckBoxList ID="_checkboxGroups" runat="Server">
                            <asp:ListItem Text="Sid Dickens Lovers" Value="SidDickens_TF" Selected="False" />
                            <asp:ListItem Text="Rosamond Lover" Value="Rosamond_TF" Selected="false" />
                            <asp:ListItem Text="Wine and Cheese Lovers" Value="WineAndCheese_TF" Selected="false" />
                            <asp:ListItem Text="Good Clients" Value="IntDesign_TF" Selected="false" />
                            <asp:ListItem Text="Vendors" Value="Vendor_TF" Selected="false" />
                        </asp:CheckBoxList>

Code derrière :

// determine # of items in asp:CheckBoxList
        var groupCount = _checkboxGroups.Items.Count;

        var conditions = new List<string>();

        for (int i = 0; i < groupCount; i++)
        {
            if (_checkboxGroups.Items[i].Selected)
            {
                conditions.Add(_checkboxGroups.Items[i].Value.ToString() + " == true");
            }
        }

        string whereClause = string.Join(" OR ", conditions.ToArray());

        ElanEntities3 db = new ElanEntities3();

        var emailList = (from c in db.vEmailListViewforSendings
                         orderby c.Email
                         select c).AsQueryable();

        emailList = emailList.Where(whereClause);

       _listViewClients.DataSource = emailList;

2voto

Nicholas Butler Points 12630

Vous devez passer un objet qui correspond au paramètre à IQueryable.Where( predicate )

Así que whereClause doit être un objet de ce type :

Expression<Func<TSource, bool>>

Étant donné que vous faites un OU dans vos clauses d'interrogation et non un ET, vous devrez construire une seule grande clause d'interrogation.

Supposons que votre objet de données soit de type OBJ et qu'il possède les propriétés bool P0 et P1 :

bool filterP0 = _checkboxGroups[0].Selected;
bool filterP1 = _checkboxGroups[1].Selected;

Expression<Func<OBJ, bool>> predicate = o =>
(
    ( !filterP0 && !filterP1 )
    ||
    ( filterP0 && o.P0 )
    ||
    ( filterP1 && o.P1 )
);

var emailList =
    db.vEmailListViewForSendings
        .Where( predicate )
        .OrderBy( o => o.ID );

C'est en tout cas l'essentiel.


Ou, si vous devez vraiment construire le prédicat dynamiquement, vous pouvez utiliser Le constructeur de prédicats de Joe Albahari .

1voto

Wiktor Zychla Points 23918

Vous devriez pouvoir le faire en utilisant Linq Dynamic Query :

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

C'est pour cela que la bibliothèque a été conçue.

0voto

Michael Buen Points 20453

Vous utilisez System.Linq.Dynamic http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

var email = from c in db.MailListViewForSendings
            order by c.ID
            select c;

// then you chain the Linq;
email = email.Where("CategoryID=3");

Pour utiliser les paramètres :

var email = from c in db.MailListViewForSendings
            order by c.ID
            select c;

// then you chain the Linq;
email = email.Where("CategoryID=@0", 3);

UPDATE

N'utilisez pas StringBuilder, utilisez List<string> à la place, puis les concaténer par string.Join :

using System;

using System.Collections.Generic;

public class Test
{
        public static void Main()
        {
             var conditions = new List<string>();
             conditions.Add("Lastname = 'Lennon'");
             conditions.Add("Firstname = 'John'");
             conditions.Add("Age = 40");

             Console.WriteLine(string.Join(" OR ", conditions.ToArray() ));
        }
}

Sortie :

Lastname = 'Lennon' OR Firstname = 'John' OR Age = 40

Test en direct : http://ideone.com/EFhnA

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X