LINQ

2012-12-19 11 views
12

के साथ काम नहीं कर रहा है मैं अलग से उपयोग करके एक पंक्ति से बार-बार पंक्तियों को हटाना चाहता हूं।LINQ

यह resultset है (आप देख सकते हैं, सूचकांक 12 और 14 दोहराया जाता है)

id idIndice idName   idTipo tamanho  caminho 
12 11   Processo  3  10   C:\Program Files\Empenho\Senha.txt 
13 13   Endereço  1  250   C:\Program Files\Empenho\Senha.txt 
14 12   Número   2  5   C:\Program Files\Empenho\Senha.txt 
15 9   Cep   5  8   C:\Program Files\Empenho\Senha.txt 
16 10   Dt. de Nasc. 4  0   C:\Program Files\Empenho\Senha.txt 
12 11   Processo  3  10   C:\Program Files\Empenho\Senha.txt 
14 12   Número   2  5   C:\Program Files\Empenho\Senha.txt 

यह एसक्यूएल मैं archieve करने के लिए (यह काम करता है)

select DISTINCT u.id, u.idIndice, t.idName, t.idTipo, t.tamanho, l.caminho 
from tgpwebged.dbo.sistema_Indexacao as u 
join tgpwebged.dbo.sistema_Indexes as t on u.idIndice = t.id 
join tgpwebged.dbo.sistema_Documentos as l on u.idDocumento = l.id 
join tgpwebged.dbo.sistema_DocType_Index as v on t.id = v.indexId 
where u.idDocumento = 10 
चाहते है

यह LINQ मैं

अनुकूल करने के लिए कोशिश कर रहा हूँ है

List<Gedi.Models.OperacoesModel.getDocIndex> docIndexModelDup = docObj.ToList(); 
List<Gedi.Models.OperacoesModel.getDocIndex> docIndexModel = 
docIndexModelDup.Distinct().ToList(); 

लेकिन जैसे अगर वहाँ सभी में कोई विभेद नहीं है मैं अभी भी एक ही 7 पंक्तियाँ मिलती है:

यह मैं क्या कोशिश कर रहा हूँ है।

क्यों?

+1

'getDocIndex' को लागू करता है 'IEquatable '? –

+4

http://blog.jordanterrell.com/post/LINQ-Distinct%28%29-does-not-work-as-expected.aspx –

+0

@Massimiliano Peluso पूरी तरह से काम किया। धन्यवाद –

उत्तर

1

प्रयास करें:

var distinctRowsById = docObj.Select(i => i.Id) 
    .Distinct() 
    .Select(i => docObj.First(o => o.Id == i) 
+5

मैंने इसे आजमाया नहीं है, लेकिन आपके कोड को देखकर मुझे लगता है कि यह डुप्लिकेट को नहीं हटाएगा क्योंकि प्रत्येक पंक्ति में निश्चित रूप से एक आईडी होगा जो आईडी के अलग-अलग सूची से उसी सेट से मेल खाती है ..? –

+0

आप सही हैं, इसे अभी देखें। मुझे पहले यह मुद्दा था और मैंने इसे हल करने का एकमात्र तरीका यह तरीका – lante

+0

काम करेगा। हालांकि, प्रदर्शन अन्य सभी सुझाए गए उत्तरों से भी बदतर है, क्योंकि यह 'docObj' अनुक्रम * एन * +1 बार पर फिर से चलाता है, जहां * n * विशिष्ट आईडी की संख्या है: एस। मैं तो बस कह रहा हूं'। फ़ेलिज नेविदाद, निकोलस। –

6

आप अलग एसक्यूएल में प्रदर्शन चाहते हैं, अलग फोन() ToList से पहले()।

var docObj = (from u in context.sistema_Indexacao 
    join t in context.sistema_Indexes on u.idIndice equals t.id 
    join l in context.sistema_Documentos on u.idDocumento equals l.id 
    join v in context.sistema_DocType_Index on t.id equals v.indexId 
    join m in context.sistema_DocType on v.docTypeId equals m.id 
    where u.idDocumento == id 
    select new Gedi.Models.OperacoesModel.getDocIndex 
    { ... }).Distinct().ToList(); 
+0

दुर्भाग्य से यह मेरी समस्या का समाधान नहीं करता है।क्या मुझे कुछ कक्षाओं को इसे पूरा करने के लिए ओवरराइट करना चाहिए? सूची –

+0

में अभी भी 7 इन्सियां ​​बनी हुई हैं क्या आप अपने एसक्यूएल स्टेटमेंट से वही कॉलम चुन रहे हैं? – jrummell

5
var docIndexModel = docIndexModelDup 
    .GroupBy(x => x.Id) 
    .Select(g => g.First()); 
0

अपने getDocIndex वस्तु पर, आप इंटरफ़ेस IEquatable. लागू करने की आवश्यकता इस विशिष्ट विधि है या नहीं, अपने वस्तुओं एक दूसरे के बराबर हैं बता देंगे जब यह एक तुलना करता है। यह अलग से तुलना करने का सही तरीका है और यह बहुत साफ है।

public class getDocIndex: IEquatable<getDocIndex> 
{ 
    .... 
    public bool Equals(getDocIndex otherModel) 
    { 
     if (otherModel == null) 
      return false; 
     return this.idName == otherModel.idName && this.idTipo == otherModel.idTipo 
     && this.tamanho == otherModel.tamanho && this.caminho == otherModel.caminho; 
    } 
} 

इस इंटरफेस को लागू करने के बाद, आप अलग-अलग कॉल करना जारी रख सकते हैं और यह सही तरीके से काम करेगा।

+0

लेकिन यह जेनरेट किए गए एसक्यूएल को प्रभावित नहीं करेगा, जो यहां इरादा प्रतीत होता है। – svick

+0

मैंने बस अपने प्रश्न का उत्तर दिया। "मैं अलग-अलग उपयोग करके लिस्ट से दोहराई गई पंक्तियों को हटाना चाहता हूं।" "लेकिन मुझे अभी भी वही 7 पंक्तियां मिलती हैं जैसे कि कोई डिस्टिंट नहीं है। क्यों?" –

0

जब भी एसक्यूएल का उपयोग करते हैं, तो डिस्टिंट() का उपयोग करें। टोस्टिस्ट()। यह शायद समस्या को हल करेगा। उदाहरण के लिए:

var ans = (from x in xyx 
      where ... 
      select new ... 
      { 
       a = ..., 
       b = ... 
      }).Distinct().ToList(); 
0

अलग काम करता है केवल लैम्ब्डा ..like इस

var data =_CustomerCompanyRepository.GetAll().Where(p => (p.PrimaryUser == userid || p.SecondayUser == userid)).Distinct(); 

हम LINQ क्वेरी में डुप्लिकेट को निकालना चाहते हैं ..use समूह

var Account = (from c in depa join u in UserManager.Users on c.Id equals u.DepartmentId 
           group c by c into g 
           select new datadto{ Id = g.Key.Id, Name = g.Key.DepatmentName }).ToArray(); 
संबंधित मुद्दे