|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C# / Linq To Entities]Problema con duplicati
Buonasera a tutti.
Vorrei capire come rimuovere dei duplicati da una "query": Codice:
using(GammaEntities context = new GammaEntities())
{
var result = context.CustomView.Where
(
x.SomeValue == "BLA"
&& x.OtherValue != "BOB"
)
aBinding.BindingSource = result.OrderBy(x => x.aField);
}
vengono restituiti duplicati. Per duplicato intendo che è la stessa identica riga con gli stessi identici valori. Grazie a tutti. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Altamura
Messaggi: 919
|
Quote:
__________________
Trattative : http://swdev.altervista.org/VenditeAcquisti.txt Blog Tecnico : http://blogs.dotnethell.it/SwDev/ Desktop : i7 920,GTX580 PALIT, Obsidian 800D, 6GB Corsair, OCZ Vertex 3 240gb. Desktop 2 : iMac 27'' MID 2011 i5, 4GB |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Ma su questo purtroppo non abbiamo modo di agire. Il database in questione è solo una replica (su sql server 2008) di un db proprietario.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Altamura
Messaggi: 919
|
Quote:
Comunque dovresti scriverti una classe comparer (eredita da IEqualityComparer) : Codice:
class TuoRecordComparer : IEqualityComparer<TuoRecord> {
public bool Equals(TuaEntità x, TuaEntità y) {
return x.CampoA == y.CampoA && x.CampoB == y.CampoB && Etc... ;
}
public int GetHashCode(TuaEntità obj) {
return obj.CampoA.GetHashCode() * obj.CampoB.GetHashCode();
}
}
Codice:
List<TuaEntità> res = TuaCollection.Distinct(new TuoRecordComparer());
__________________
Trattative : http://swdev.altervista.org/VenditeAcquisti.txt Blog Tecnico : http://blogs.dotnethell.it/SwDev/ Desktop : i7 920,GTX580 PALIT, Obsidian 800D, 6GB Corsair, OCZ Vertex 3 240gb. Desktop 2 : iMac 27'' MID 2011 i5, 4GB |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
per la "replica" hai pvt
Ora provo ad implementare il tuo suggerimento.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
un semplice distinct alla fine?
Codice:
using(GammaEntities context = new GammaEntities())
{
var result = context.CustomView.Where
(
x.SomeValue == "BLA"
&& x.OtherValue != "BOB"
)
aBinding.BindingSource = result.OrderBy(x => x.aField).Distinct();
}
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Avevo già provato con la distinct ma senza successo. E ho provato anche a spostarlo "all'inizio" Codice:
var result = context.Bla.Distinct().Where(blablabla);
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Altamura
Messaggi: 919
|
Quote:
E' vero, con il comparer l'operazione viene effettuata in memoria, ma non mi sembra un gran danno, ipotizando il numero di record. L'unico modo per effettuare lo scarto dei duplicati direttamente sul DB è utilizzare una GroupBy a questo punto... Codice:
var Res = TuaCollection.GroupBy(o => o.CampoA).Select(g => g.First());
__________________
Trattative : http://swdev.altervista.org/VenditeAcquisti.txt Blog Tecnico : http://blogs.dotnethell.it/SwDev/ Desktop : i7 920,GTX580 PALIT, Obsidian 800D, 6GB Corsair, OCZ Vertex 3 240gb. Desktop 2 : iMac 27'' MID 2011 i5, 4GB |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
Ma il distinct in SQL mica richiede la presenza di una chiave primaria...
Potresti postare la query generata da EF? In alternativa potrebbe fare una projection dell'entity in un tipo anonimo, eseguire il distinct e convertire gli oggetti restituiti in entity. Ovviamente in questo modo si perde il tracking automatico delle modifiche, ma quello era già buono ed andato con il comparer in memory |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Il Distinct non funziona se non c'e' un comparer perche' 2 istanze diverse della stessa classe, anche quando contenessero gli stessi identici valori, sarebbero di per se' differenti in quanto risiedono su diverse zone di memoria e il comparer di default si basa proprio su quello.
Se per caso CustomView fosse una collezione di DataRow, puoi usare il comparer Standard delle DataRow aBinding.BindingSource = result.Distinct(DataRowComparer.Default).OrderBy(x => x.aField); Altrimenti anche io propenderei per la soluzione con il group by var Res = result.GroupBy(o => o.CampoA) .Select(g => g.First()) .OrderBy(x => x.aField);
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
Quote:
Per provare ho eseguito questa query con LinqPad su un database che avevo a portata di mano: Codice:
Institutes.Select(c => new
{
c.FKSiteID, c.IsPublished, c.HasLogo, c.FKUpdatedByID
}).Take(1000).Distinct().Dump();
Codice:
SELECT DISTINCT [t1].[FKSiteID], [t1].[IsPublished], [t1].[HasLogo], [t1].[FKUpdatedByID]
FROM (
SELECT TOP (1000) [t0].[FKSiteID], [t0].[IsPublished], [t0].[HasLogo], [t0].[FKUpdatedByID]
FROM [institute].[Institutes] AS [t0]
) AS [t1]
Ultima modifica di Kralizek : 24-04-2012 alle 09:56. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Eccomi
utilizzando il metodo GroupBy effettivamente i duplicati vengono rimossi, soltanto che, in particolari circostanze, ad esempio un numero fattura uguale per cliente o fornitore presenti nella vista (es. fatt cliente 156, fatt fornitore 156) mi da un solo record se il raggruppamento viene fatto sul numdoc (e non ho altri campi validi per raggruppare). Credo che sia sbagliata proprio la progettazione della vista a monte ma su quella posso fare ben poco. Per lo scopo ho dovuto risolvere in un'altra maniera: 1) I dati mi servivano per generare un tracciato record per l'agenzia delle entrate 2) Generato il tracciato record con tutti i duplicati, sono andato ad agire sul tracciato per rimuoverli mediante: Codice:
File.WriteAllLine(@"trNoDup", lines.Distinct().ToArray()); non ne scarta più nessuno.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Altamura
Messaggi: 919
|
Quote:
L'importante è aver risolto, il principio del KISS è stato seguito alla perfezione
__________________
Trattative : http://swdev.altervista.org/VenditeAcquisti.txt Blog Tecnico : http://blogs.dotnethell.it/SwDev/ Desktop : i7 920,GTX580 PALIT, Obsidian 800D, 6GB Corsair, OCZ Vertex 3 240gb. Desktop 2 : iMac 27'' MID 2011 i5, 4GB |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Se dovesse cambiare la struttura della tabella/vista sottostante, alla meglio non compili, alla peggio potresti perdere qualche riga senza accorgertene. Resta comunque una buona soluzione.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 25-04-2012 alle 01:22. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:03.




















