OK OK, so che questo è un hack, ma questo era per un piccolo progetto di manipolazione dei dati e volevo giocare. ;-)Ottimizzazioni del compilatore di tipi anonimi
Ho sempre avuto l'impressione che il compilatore avrebbe esaminato tutti i tipi anonimi utilizzati in un programma C# e se le proprietà fossero le stesse, creerebbe solo una classe dietro le quinte.
Quindi diciamo che voglio creare un tipo anonimo di alcuni dataset tipizzati che ho:
var smallData1 = new smallData1().GetData().Select(
x => new { Name = x.NAME, x.ADDRESS, City = x.CITY, State = x.STATE,
Zip = x.ZIP, Country = x.COUNTRY, ManagerName = x.MANAGER_NAME,
ManagerID = x.MANAGER_ID });
var smallData2 = new smallData2().GetData().Select(
x => new { x.Name, x.ADDRESS, x.City, x.State, x.Zip, x.Country,
x.ManagerName,x.ManagerID });
ora posso fare cose divertenti come smallData2.Except (smallData1); ecc. E tutto funziona.
Ora, che cosa se ho una coppia più alta di tipi anonimi:
var bigData1 = new BigAdapter1().GetData().Select(
x => new { x.FirstName, x.LastName, x.Address, x.City, x.State,
x.Zip, x.Country, x.Phone, x.Email, x.Website, x.Custom1, x.Custom2,
x.Custom3, x.Custom4, x.Custom5, x.Custom6, x.Custom7, x.Custom8, x.Custom9,
x.Custom10, x.Custom11, x.Custom12, x.Custom13, x.Custom14, x.Custom15,
x.Custom16, x.Custom17, x.Custom18, x.Custom19, x.Custom20, x.Custom21,
x.Custom22, x.Custom23, x.Custom24, x.Custom25, x.Custom26, x.Custom27,
x.Custom28, x.Custom29});
var bigData2 = new BigAdapter2().GetData().Select(
x => new { x.FirstName, x.LastName, x.Address, x.City, x.State, x.Zip,
x.Country, x.Phone, x.Email, x.Website, x.Custom1, x.Custom2, x.Custom3,
x.Custom4, x.Custom5, x.Custom6, x.Custom7, x.Custom8, x.Custom9, x.Custom10,
x.Custom11, x.Custom12, x.Custom13, x.Custom14, x.Custom15, x.Custom16,
x.Custom17, x.Custom18, x.Custom19, x.Custom20, x.Custom21, x.Custom22,
x.Custom23, x.Custom24, x.Custom25, x.Custom26, x.Custom27,
x.Custom28, x.Custom29});
Ora, quando faccio bigData2.Except (bigData1); il compilatore si lamenta:
Instance argument: cannot convert from
'System.Data.EnumerableRowCollection<AnonymousType#1>' to
'System.Linq.IQueryable<AnonymousType#2>'
Perché? Troppe proprietà, quindi il compilatore decide che non vale la pena di ottimizzare?
Grazie!
Sì, gli adattatori stanno restituendo tipi di dati leggermente diversi, ma la differenza è solo il tipo di set di dati tipizzati (provengono da database diversi). Tutte le proprietà sono stringhe, motivo per cui ho pensato di utilizzare solo un tipo anonimo e che mi permettesse di trattare i dati come UN tipo di tipo anziché due. – Pandincus
OMG DOVE HA FATTO DOPPIO DOPPIO. Err ... okay, avevi completamente ragione. Uno dei tipi è davvero diverso. Immagino sia quello che succede quando si telefona a tarda notte: -O – Pandincus