2015-05-18 7 views
10

से भिन्न परिणाम देता है यदि मैं अपने इकाई ढांचे के परिणाम पर IQueryable पर चयन का उपयोग करता हूं तो मुझे परिणामस्वरूप 4 आइटम मिलेंगे।IQueryable <T> सूची <T>

यदि मैं एक IQueryable.ToList() पर चयन का उपयोग करता हूं तो मुझे सभी 36 आइटम मिलते हैं।

public ImagesGetModelView Get(int start, int count) 
{ 
    if (count <= 0) count = 9; 
    else if (count > ImageHandler.MaxResult) count = ImageHandler.MaxResult;  

     IQueryable<Image> imagesList = ImagesHandler.FetchRangeScore(start, count) 
      .Where(m => m.Domain == Database.Enums.ImageDomain.Gfycat); 

     //Works using list :(
     //var list = imagesList.ToList(); 

     //Select all subreddits once 
     //Returns 4 instead of 36 if not using the list ... 
     //Returns 1 instead of 2 with Distinct() if not using the list 
     IEnumerable<Subreddit> subreddits = imagesList 
      .Select(m => m.Subreddit); //.Distinct();   

     ImagesGetModelView result = new ImagesGetModelView() 
     { 
      Items = imagesList, 
      Subreddits = subreddits 
     }; 

     return result; 
    } 

public IQueryable<Image> FetchRangeScore(int a_start, int a_count) 
    { 
     return Repository.AllQueryable().OrderByDescending(m => m.Score) 
      .Skip(a_start).Take(a_count); 
    } 

36 आइटम 2 subreddits अलग हो जाएगा से बाहर:

यहाँ समारोह के कोड है। लेकिन चूंकि 36 में से केवल 4 में से चयन 4 से प्राप्त किए जाते हैं() यह केवल 1 विशिष्ट पाता है।

तो क्या कुछ भी है जो मैं LINQ अभिव्यक्तियों के साथ सही डेटा प्राप्त करने के लिए कर सकता हूं ताकि अलग कथन काम करता है या क्या मुझे & चुनिंदा कार्यों के साथ जारी रखने से पहले इसे एक सूची में बनाना है?

संपादित करें:
पूरी क्वेरी की शुरुआत से अंत तक कहां स्थानांतरित करके। यह अभी सही ढंग से काम करता प्रतीत होता है। सभी 36 आइटम e.t.c लौटाएं चुनें ... जो बदले में अलग काम करता है क्योंकि यह 1 से अधिक अद्वितीय मान पा सकता है।

public IQueryable<Image> FetchRangeScore(int a_start, int a_count) 
    { 
     return Repository.AllQueryable() 
      .Where(m => m.Domain == Database.Enums.ImageDomain.Gfycat) 
      .OrderByDescending(m => m.Score) 
      .Skip(a_start).Take(a_count); 
    } 
+0

कुछ नकली डेटा यहां आपके बिंदु को चित्रित करने में मदद कर सकते हैं। – neontapir

+1

मैं आपके तर्क के अलग-अलग संस्करण डालने की सिफारिश करता हूं (या आपने जो बदल दिया है उसका दूसरा कोड स्निपेट)। कोड के भीतर टिप्पणियों का पालन करना मुश्किल हो सकता है जिसे अलग-अलग करने की आवश्यकता है (उदाहरण के लिए मैं यह नहीं बता सकता कि आप उदाहरण टूट गए हैं या सही तरीके से काम कर रहे हैं)। – Guvante

+1

क्या आप एक अलग कॉल करने से पहले पेजिंग कर रहे हैं? मैं आमतौर पर विपरीत क्रम की उम्मीद करता हूं। – Guvante

उत्तर

5

संभवतः आपके Where खंड SQL सर्वर में अलग-अलग व्यवहार कर रहा है, यह .NET में होगा। विशेष रूप से, आपकी collation सेटिंग्स और इस तरह के आधार पर, यह संभावना है कि विभिन्न .Domain मान केवल पूंजीकरण या उसके जैसे कुछ भिन्न होते हैं, जिससे उन्हें SQL में Gfycat में "बराबर" बना दिया जाता है, लेकिन सी # में नहीं।

आप अपने IQueryable<> पर .ToString() पर कैप्चर कर सकते हैं यह देखने के लिए कि SQL क्या उत्पादित किया जा रहा है और इसे स्वयं आज़माएं।

IQueryable<Image> imagesList = ImagesHandler.FetchRangeScore(start, count) 
    .Where(m => m.Domain == Database.Enums.ImageDomain.Gfycat); 
Debug.WriteLine(imagesList.ToString()); 
+0

मेरा मानना ​​है कि आप सही हैं। आपने मुझे एहसास दिलाया कि मेरे पास एक बयान था :) मैंने इसे लंबे समय से परीक्षण के लिए जोड़ा और इसके लिए अंधेरा हो गया। जब आप इसे देखते हैं तो यह काफी स्टडी रखा जाता है, लेकिन डेटासेट 36 में से 1 प्रकार के 35 सब्रेडडिट्स है, इसलिए मैंने कभी नहीं देखा कि यह कल रात तक गलत है। जब मैंने इसे क्वेरी की शुरुआत में ले जाया तो मैंने देखा कि Debug.WriteLine() ने अब एक सबक्वायरी वापस नहीं किया है और सबकुछ भी काम करता है। –

5

यह स्रोत डेटा के बिना निश्चित होने के लिए मुश्किल है, लेकिन जब एसक्यूएल को धक्का दे अलग ढंग से Distinct काम करता है।

एक एसक्यूएल DISTINCT क्वेरी रिकॉर्ड खींच जाएगी जहां सभी मान अलग हैं। जब आप Distinct मेमोरी में ऑब्जेक्ट्स की सूची पर कॉल करते हैं, तो डिफ़ॉल्ट रूप से यह इंस्टेंस समानता का उपयोग करेगा। तो आप वापस "डुप्लिकेट" ऑब्जेक्ट्स प्राप्त कर सकते हैं (ऑब्जेक्ट्स जहां सभी फ़ील्ड मान समान हैं), लेकिन वे अलग-अलग "उदाहरण" होंगे, इसलिए Distinct उन्हें विभिन्न ऑब्जेक्ट्स के रूप में मानता है।

तो यह आप क्या चाहते हैं पर निर्भर करता है - आप डुप्लिकेट सहित सभी Subreddit मूल्यों चाहते हैं या आप अलग मूल्यों चाहते क्या करते हो?

आपके प्रश्न का उत्तर करने के लिए - अगर आप नहीं चाहते Distinct कॉल एसक्यूएल आप ToList के बजाय AsEnumerable() है, जो सभी के लिए आगे Linq बनाता है कॉल कर सकते हैं करने के लिए नीचे पारित कर दिया प्रश्नों Linq- की Linq करने वाली वस्तुओं (IEnumerable<T>) प्रश्नों के बजाय टू- {जो भी} (IQueryable<T>) क्वेरी, आइटम को सूची में डालने के ऊपरी हिस्से के बिना।

+0

मैं केवल विशिष्ट मानों को डुप्लीकेट नहीं चाहता हूं। मुझे परिणामों के लिए अलग-अलग subreddits की जरूरत है। –

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