2015-10-13 11 views
8

मैं एफई का उपयोग करके विभाजन से अधिक ROW_NUMBER से डेटा लोड करना चाहते हैं।ROW_NUMBER से अधिक (yyy द्वारा विभाजन)

SELECT * 
    FROM (
     SELECT sf.SerialFlowsId 
        ,sf.GoodsSerialId 
        ,d.FormTypeId 
        , d.GoodsId 
        ,ROW_NUMBER() OVER (PARTITION BY d.GoodsId, sf.GoodsSerialId ORDER BY sf.Date DESC)row 
     FROM sam.SerialFlows sf 
     INNER JOIN sam.Detail d ON d.DetailId = sf.DetailId 
     )z 
WHERE z.row =1 
     AND z.FormTypeId=7 
     AND z.GoodsId=51532 

यह क्वेरी मेरी अपेक्षा है।

मैं इस अभिव्यक्ति का उपयोग करने की कोशिश लेकिन दुर्भाग्य ज़िप विस्तार विधि एफई

var goodsSerials = context.SerialFlows.OrderByDescending(x => x.Date).GroupBy(x => new { x.Detail.GoodsID, x.Date }) 
        .Select(g => new {g}) 
        .SelectMany(z => z.g.Select(c => c)).Zip(m, (j, i) => new { GoodSerial=j,j.Detail.FormTypeID,j.Detail.GoodsID,rn=i }) 
        .Where(x => x.rn== 1 && x.GoodsID== goodsId && x.FormTypeID==7).Select(x => x.GoodSerial).ToList(); 

में पहचान नहीं मैं SerialFlows तालिका में एक से अधिक 20000000 रिकॉर्ड है।

** संपादित

var goodsSerials = context.SerialFlows 
              .Where(e => e.Detail.GoodsID == goodsId) 
              .GroupBy(x => x.GoodsSerialID) 
              .Select(g => g.OrderByDescending(e=>e.Date).Take(1)) 
              .SelectMany(e => e.Where(x=>x.Detail.FormTypeID==7).Select(z=>z.GoodsSerial)).ToList(); 

*** इस क्वेरी

 var goodsSerials = context.SerialFlows 
              .Include(x => x.Detail) 
              .Where(e => e.Detail.GoodsID == goodsId) 
              .GroupBy(x => x.GoodsSerialID) 
              .Select(g => g.OrderByDescending(e => e.Date).Take(1).Where(x=>x.Detail.FormTypeID==7)) 
              .SelectMany(e => e.Select(z => z.GoodsSerial)).ToList(); 
+2

क्यों downvote? मुझे एक बिल्कुल अच्छा सवाल लगता है। – pseudocoder

उत्तर

8

द्वारा हल अपने SQL क्वेरी से, मैं तुम्हें पहले समूह उन सब PARTITION BY खंड में क्या, प्रत्येक आदेश द्वारा करने की जरूरत है लगता है तिथि से समूह। फिर प्रत्येक समूह को अपनी प्रविष्टि के साथ प्रत्येक प्रविष्टि को शामिल करने के लिए प्रोजेक्ट करें। फिर SelectMany सभी समूहों को फ़्लैट करने के लिए, फिर फ़िल्टर लागू करें और अंत में इच्छित परिणाम को प्रोजेक्ट करें। आप देख सकते हैं कि हमें तथाकथित Zip की आवश्यकता नहीं है।

संपादित: क्योंकि आप पंक्ति संख्या पर फिल्टर करने के लिए की जरूरत है लेकिन Select विधि को स्वीकार एक Expression<Func<T,int,TResult>> समर्थित नहीं है (और साथ ही संस्था के लिए Linq में Zip विधि) की तरह दिखता है। मुझे नहीं लगता कि यह अभिव्यक्ति वृक्ष बनाने की समस्या है, जिसका अर्थ है कि इसे मैन्युअल रूप से बनाना, फिर भी इसका समर्थन नहीं किया जाएगा। मुझे लगता है कि आप कुछ काम के आसपास है जिसमें आप अभी भी पंक्ति आप के बजाय Skip और Take का उपयोग कर चाहते फ़िल्टर कर सकते हैं का उपयोग कर सकते हैं। GoodsID का केवल 1 मूल्य के लिए

var goodsSerials = context.SerialFlows 
          .Where(e => e.Detail.GoodsID == goodsId && 
             e.Detail.FormTypeID == 7) 
          .GroupBy(x => new { x.Detail.GoodsID, x.GoodsSerialId }) 
          .Select(g => g.OrderByDescending(e => e.Date) 
             .Take(1)) 
          .SelectMany(e => e).ToList(); 

Where फिल्टर तो GroupByGoodsID शामिल करने के लिए की जरूरत नहीं है:

निम्नलिखित कोड (हालत rn == 1 के बराबर) प्रत्येक समूह में सिर्फ पहली पंक्ति फिल्टर करेगा

var goodsSerials = context.SerialFlows 
          .Where(e => e.Detail.GoodsID == goodsId && 
             e.Detail.FormTypeID == 7) 
          .GroupBy(x => x.GoodsSerialId) 
          .Select(g => g.OrderByDescending(e => e.Date).Take(1)) 
          .SelectMany(e => e).ToList(); 

मुझे आशा है कि आप Skip और +०१२३१६९९५४८ प्रयोग का विचार को समझने: कुंजी में, तो यह इस तरह सरल होगा विभिन्न मामलों में आवेदन करने के लिए।

+0

unforunently मैं error.Additional जानकारी मिल गया है: संस्थाओं को LINQ विधि 'System.Collections.Generic.IEnumerable –

+0

को नहीं पहचानता है मेरे संपादन देख @MahdiFarhani, लगता है कि हम शायद ही पंक्ति संख्या निकाल सकते हैं, लेकिन छानने के प्रयोजन के लिए , हमारे पास एक सुंदर काम है। –

+0

यह चलाया गया है, लेकिन प्रदर्शन स्वीकार्य नहीं है। इसमें 4 मिनट लगते हैं और मैंने इसे रद्द कर दिया है। –

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