2015-05-07 4 views
5

मैं एक सामान्य वर्ग कि फिल्टर करने, आदेश, परियोजना और एक IQueryable पृष्ठ पर अंक लगाना माना जाता है है को दूर नहीं करता:एफई IQueryable पर अलग इस विधि को फोन करके डुप्लिकेट

public async Task<PagedResult<TResult>> GetFilteredOrderedPageAsync<TResult>(IQueryable<TSource> source, 
      IFilterModel filterModel, 
      ISortModel sortModel, 
      int page, int pageSize, 
      Expression<Func<TSource, TResult>> converter) 
      where TResult : class 
     { 
      var filtered = Filter(source, filterModel); 

      var projected = filtered 
       .Select(converter) 
       .Distinct(); 

      var ordered = Sort<TResult>(projected, sortModel); 

      var result = await GetPageAsync<TResult>(ordered, page, pageSize, converter); 

      return result; 
     } 

मैं Distinct() यहाँ

बोल रहा हूँ प्रक्षेपण के बाद दिखाई देने वाले किसी भी डुप्लीकेट को हटाने के लिए
 var projected = filtered 
      .Select(converter) 
      .Distinct(); 

मेरे धारणा यह थी कि EF6 एक ही यदि एक ही col1, col2, col3 लेकिन अलग col4 साथ दो पंक्तियों हैं

SELECT DISTINCT Col1, Col2, Col3 FROM (SELECT Col1, Col2, Col3, Col4 FROM SOME_TABLE WHERE <some conditions on co1, col2, col3, col4 ...>) 

की तरह कुछ यानी कि वह प्रक्षेपण के लिए DISTINCT लागू होगा उत्पन्न होगा, इसलिए,, पंक्ति इसे परिणाम में बना देगा। हालांकि, एसक्यूएल है कि मैं पाने के इस तरह दिखता है:

SELECT Col1, Col2, Col3, Col4 FROM (SELECT DISTINCT Col1, Col2, Col3, Col4 FROM SOME_TABLE) 

- कोई प्रक्षेपण, और विशिष्ट, एक सबक्वेरी में स्थानांतरित कर दिया गया है जैसे कि मैं यह कर रहे थे जाता है:

var projected = filtered      
       .Distinct() 
       .Select(converter) 

मैं के लिए इस सेवा चाहते हैं एक सामान्य, यानी TSource और TResult के साथ संभावित रूप से काम करना, लेकिन ऐसा लगता है कि यहां कुछ गड़बड़ है और ईएफ क्या करता है मेरी समझ सही नहीं है।

यहां क्या हो रहा है?

अद्यतन

मेरा मानना ​​है कि समस्या मेरी कनवर्टर में है।

public class ProvidersViewModel 
{ 
    public string Name { get; set; } 
    public Rate Rate { get; set; } 
    publi QA QA { get; set; } 
    ... 
    public static Expression<Func<ProviderJoinRateAndQA, ProvidersViewModel>> FromProvider(bool showRateAndQA) 
    { 
     return x => new ProvidersViewModel { 
     Name = x.Name, 
     Rate = showRateAndQA ? new Rate { Amount = x.Rate.Amount ... } : null, 
     Rate = showRateAndQA ? new QA { Grade = x.QA.Grade ... } : null 
    }; 
} 

}

ProviderJoinRateAndQA एक प्रदाताओं, अपनी दरें और प्रश्नोत्तर के शामिल होने है: मैं लैम्ब्डा अभिव्यक्ति Select के लिए पारित उत्पन्न करने के लिए निम्नलिखित समारोह का इस्तेमाल किया। प्रत्येक Provider में कई सेवाएं, दरें और qas हो सकते हैं। कुछ मामलों में मैं मॉडल को दर और क्यूए जानकारी छिपाने के लिए देखना चाहता हूं। मुझे लगता है कि मैं इसे nullRate और QA गुणों को असाइन करके कर सकता हूं, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है: Distinct गलत तरीके से काम करता है।
दर = showRateAndQA को बदलने के बाद? नया क्यूए {ग्रेड = x.QA.Grade ...}: दर = नया क्यूए {ग्रेड = showRateAndQA? x.QA.Grade: शून्य ...},

Distinct सही ढंग से काम किया।

स्पष्ट रूप से ईएफ को मेरे लैम्ब्डा में ऑब्जेक्ट करने के लिए null असाइन करना पसंद नहीं आया।

+0

एक बग की तरह लग रहा। क्या आप एक निष्पादन योग्य repro पोस्ट कर सकते हैं? ईएफ को वैसे भी एक फिक्स के लिए इसकी आवश्यकता होगी। – usr

+0

मैं इन सबसे छुटकारा नया हूँ, पता नहीं कैसे निष्पादन रेप्रो सही ढंग से पोस्ट करने के लिए। बस कोड पोस्ट करें या परियोजना को कहीं छोड़ दें और उससे लिंक करें? – AunAun

+0

आप इस के बारे में सुनिश्चित कर रहे हैं? क्या आप सुनिश्चित हैं कि आपका कनवर्टर सही है? – xanatos

उत्तर

0

स्मृति से, डिफ़ॉल्ट Distinct() कार्यान्वयन संबंधित कक्षा के लिए डिफ़ॉल्ट Equals() विधि का उपयोग करके कार्य करता है, जो अक्सर अनचाहे होता है (मुझे यह कम से कम मेरे काम के मामले में पाया गया है)।

आप निम्न की तरह कुछ स्थापित करने के लिए की जरूरत है;

public class ProvidersViewModel : IEqualityComparer<ProvidersViewModel> 
{ 
    public bool Equals(ProvidersViewModel x, ProvidersViewModel y) 
    { 
     if (x.col1 == y.col1 && x.col2 == y.col2 && x.col3 == y.col3) 
      return true; 
     else 
      return false; 
    } 

    public int GetHashCode(ProvidersViewModel obj) 
    { 
     int hCode = obj.col1^obj.col2^obj.col3; 
     return hCode.GetHashCode(); 
    } 

    // Existing code, fields, etc. 
} 

यह तो Distinct() करने के लिए कॉल ठीक से काम करने की अनुमति चाहिए।

संबंधित मुद्दे