LINQ to SQL - Generare query IN utilizzando CONTAINS

by Andrea 29 July 2008 14:02

Oggi mi sono trovato ad affrontare un problema di quelli banali, ma che (come al solito) mi ha fatto perdere un bel pò di tempo.
Il mio problema era ricavare un elenco di ID e Title dato un array di questi ID.

In SQL quello che avrei fatto sarebbe stato semplicissimo e con l’operatore IN avrei rislto in questo modo:

select id, title from Pages where id in (1,2,3,8,9)

Nel progetto a cui stò lavorando stò però utilizzando LINQ to SQL e trovare l’equivalente query è stata davvero dura (è il primo progetto dove uso seriamente LINQ to SQL), ma alla fine grazie al Contains sono riuscito a trovare la soluzione:

int[] pagesID = new int[] {1,2,3,8,9};
 
var pages = (from p in dc.Pages
             where pagesID.Contains(p.ID)
             select new { p.ID, p.Title });

Questa invece è la query generata da LINQ per recuperare i dati, che come vedete è simile a quella che avremmo realizzato noi:

exec sp_executesql N'SELECT [t0].[id] AS [ID], [t0].[Titolo] AS [Title]
FROM [dbo].[Pages] AS [t0]
WHERE [t0].[id] IN (@p0, @p1)',N'@p0 int,@p1 int',@p0=701,@p1=694

La soluzione è davvero banale, ma lo posso dire solo ora, dopo che ci ho sbattuto la testa, e la posto qui nel caso servisse anche a qualcuno di voi, o a me nel caso perdessi la memoria. ;-)

Lo spunto per la soluzione l’ho trovata in questo post: Creating IN Queries With Linq To Sql

Technorati Tags: ,

Tags:

ASP .NET | .NET

Comments

15/03/2011 06:27 #

        
Ho scritto il codice sotto indicato ma non mi ritorna nessun valore. Lo sai dirmi se almeno è giusta?

Keys --> array di stringa
dealsFilter --> xml con una lista di items
Element("region") --> nodo del elemento item del xml

Codice:

        string[] keys = keyWord.Split(' ');

        var keysArray = from k in keys
                        select k;

    --> var dealsFilter = from c in dealsFilter
                          where keysArray.Contains(c.Element("region").Value.ToLower())
                      select c;


Grazie.
Anderson

Anderson Italy |

15/03/2011 06:32 #

Prova prima a verificare cosa ti ritorna questa
var x = (from c in dealsFilter
         select c.Element("region").Value.ToLower()).ToArray();

Se ti viene ritornata una lista di stringhe, come voluto, allora il codice che hai scritto dovrebbe essere corretto. IL mio dubbio è su cosa sia contenuto in quel "Value", visto che non conosco i dati che utilizzi.

ciao

Andrea Italy |

Comments are closed