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ò.

3 commenti: