Visualizzazione post con etichetta LINQ. Mostra tutti i post
Visualizzazione post con etichetta LINQ. Mostra tutti i post

venerdì 18 febbraio 2011

LINQ to Entities - Sono supportati solo costruttori e inizializzatori senza parametri

C# 4.0
Nella seguente query LINQ l’ordinamento si basa sul campo db di tipo “stringa” quindi un ordinamento errato perché 1.0.0.11 come stringa precede 1.0.0.9:
                    var query = from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         orderby p.Version
                         select p;
Così generava l’eccezione “Sono supportati solo costruttori e inizializzatori senza parametri”:
                    var query = from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         orderby new Version(p.Version)
                         select p;
Così generava sempre l’eccezione
                    var query = (from c in dc.Customer
                        join cp in dc.CustomerPackage
                            on c.Id equals cp.IdCustomer
                        join p in dc.Package
                            on cp.IdPackage equals p.Id
                        where c.Code == customerCode
                              && c.ChainCode == chainCode
                              && c.StoreCode == storeCode
                              && cp.DownloadDate == null
                         select p).OrderBy(p => new Version(p.Version));
Così invece funziona perché passando per il metodo ToList() credo che l’OrderBy lo faccia attraverso la collezione di oggetti e non più attraverso la query entity
                    var query =
                        (from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         select p).ToList().OrderBy(p => new Version(p.Version));

Per questa segnalazione va un particolare ringraziamento a Giovanni Canacci, detto anche Giò.

martedì 23 novembre 2010

LINQ to XML - Recupero di un elemento decimal

C# 4.0
Nel leggere un valore di tipo decimal da un file XML mi si presenta un problema con i decimali in fase di casting. Ovvero il dato letto ha come separatore decimale il “.” mentre nella mia cultura è la “,” il risultato finale è quindi abbastanza evidente:
0.1   diventa 1

Questo è causato da un errato casting dell’elemento appena letto che nello specifico è:
XElement xElement = document.Root.Elements().Where(p => p.Name.LocalName.Equals("Value")).First();

decimal value = (decimal)xElement.Value;

invece si deve fare il casting dell’intero elemento XElement

decimal value = (decimal)xElement;

venerdì 3 settembre 2010

LINQ to Entities - "L'espressione LINQ specificata contiene riferimenti a query associate a contesti diversi"

C# 4.0


Una delle possibili cause di questa eccezione è quella di inserire direttamente nella lambda expression della clausola Where un oggetto var. Per ovviare questo quindi basta assegnare il suo valore ad una variabile.


if (!string.IsNullOrEmpty(typeCode))

{

// Recupero del tipo base della promozione.

var queryType = from pt in orangeRepositoryEntities.PromotionType

where pt.Code.Equals(typeCode)

select pt.BasePromotionType;


query = query.Where(p => p.PromotionType.Contains(queryType.First()));

string basePromotionType = queryType.First();
query = query.Where(p => p.PromotionType.Contains(basePromotionType));

}



if (!string.IsNullOrEmpty(code))

query = query.Where(p => p.Code.Contains(code));

if (!string.IsNullOrEmpty(salesDriveCode))

query = query.Where(p => p.SalesDriveCode.Contains(salesDriveCode));



query = query.Where(p => p.StartValidity >= fromStartValidity.Date && p.StartValidity <= toStartDate);

query = query.Where(p => p.StopValidity >= fromStopValidity.Date && p.StopValidity <= toStopDate);



foreach (var promotion in query)

{



}

venerdì 27 agosto 2010

LINQ to Entities - Condizione Where con lambda expressions

C# 4.0


In una query LINQ si presenta talvolta la necessità di aggiungere in modo condizionato uno o più parametri di ricerca in modo tale da creare una clausola Where pertinente.

Si può quindi procedere nel seguente modo utilizzando delle lambda expressions, dove in questo caso i parametri di ricerca sono rappresentati da code e salesDriveCode :

using (OrangeRepositoryEntities dcOrangeRepository = new OrangeRepositoryEntities())

{

var query =

from p in dcOrangeRepository.Promotion

select p;



if (!string.IsNullOrEmpty(code))

query = query.Where(p => p.Code.Contains(code));



if (!string.IsNullOrEmpty(salesDriveCode))

query = query.Where(p => p.SalesDriveCode.Contains(salesDriveCode));



foreach (var promotion in query)

{



}

}