2012-01-30 6 views
5

मैं डीबीसेट से क्वेरी कैसे क्रमबद्ध कर सकता हूं और बाल आइटम भी शामिल कर सकता हूं जिसे सॉर्ट किया जाना चाहिए।एमवीसी व्यू के लिए ऑर्डरिंग एंटिटी फ्रेमवर्क आइटम और चाइल्ड आइटम

उदाहरण:

मेरे पास ऑर्डर शेड्यूल करने के लिए एक मॉडल है।

public class Order 
{ 
    public virtual int Id { get; set; } 
    public virtual int? SchedulingOrder { get; set; } 
    public virtual int? WeekId { get; set; } 
    public virtual Week Week { get; set; } 
} 
public class Week 
{ 
    public virtual int Id { get; set; } 
    public virtual DateTime StartDate { get; set; } 
    public virtual ICollection<Order> Orders { get; set; } 
} 
... 
public DbSet<Week> Weeks { get; set; } 
public DbSet<Order> Orders { get; set; } 

फिर एक कार्य विधि

public ActionResult ShopSchedule() 
{ 
    return View(db.Weeks.OrderBy(w => w.StartDate) 
       .Include(w => w.Orders.OrderBy(o => o.SchedulingOrder)) 
       .ToList()); 
} 

यह मैं Include की प्रकृति की वजह से लगता है कि काम नहीं करता। क्या मुझे एक अलग दृश्य मॉडल बनाना है और इसे मानचित्र बनाना है? या क्या क्वेरी में ठीक उसी तरह पहुंचने का कोई तरीका है? कुछ प्रकार का वाक्यविन्यास है जहां लोग new { left = right, etc } क्वेरी के भीतर कहते हैं?

संबंधित प्रश्नों:
Ordering Entity Framework sub-items for EditorFor
C# Entity Framework 4.1 Lambda Include - only select specific included values

+0

मुझे नहीं लगता क्योंकि एचटीएमएल सहायकों का उपयोग लैम्ब्डा के मैं दृश्य के लिए अनाम प्रकार पारित कर सकते हैं करते हैं। मैं बस अनुमान लगा रहा हूं कि इसमें कोई समस्या होगी लेकिन शायद मुझे जांच करनी चाहिए। – Benjamin

+0

वही प्रश्न: http://stackoverflow.com/questions/8447384/how-to-order-child-collections-of-entities-in-ef?rq=1 LINQ-to-Entities (SQL-like) का उपयोग करके वही प्रश्न वाक्यविन्यास: http://stackoverflow.com/questions/3981417/how-to-sort-inner-list-that-is-returned-by-entity-framework?rq=1 –

+0

इसके अलावा http://stackoverflow.com/questions/7522784/ef-4-1-code-first-how-to-order-navigation-Properties-when-use-include-and-or/7528266 # 7528266 –

उत्तर

3

आप ठीक कह रहे हैं, तो आप में आदेश का उपयोग नहीं कर सकते हैं शामिल करें, यह उस तरह से काम करने के लिए नहीं है। लेकिन आप ऑर्डर संग्रह पर OrderBy का उपयोग करके परिणाम को देख सकते हैं। इसके अलावा, आप सीधे परिणाम लौट रहे हैं, यह return View(db.Weeks...) नहीं होना चाहिए;

+0

ओह, हाँ, यह कहना चाहिए कि 'वापसी देखें (आदि) ' मैं इसे ठीक कर दूंगा और इसे दृश्य में सॉर्ट करने का प्रयास करूंगा। धन्यवाद। – Benjamin

+0

हाँ यह काम करता है! धन्यवाद! – Benjamin

+0

ध्यान दें कि यह बहुत ही प्रभावशाली नहीं है - आप अनियंत्रित आइटम लोड कर रहे हैं, जो अक्सर SQL सर्वर में धीमे हो सकते हैं, फिर उन्हें स्मृति में पुन: व्यवस्थित कर सकते हैं - जब आप डेटाबेस का उपयोग कर सकते हैं तो SQL में उन्हें ऑर्डर करके यह अच्छा है पहली जगह में (मेरा जवाब देखें)। –

1

इस तरह काम करना चाहिए:

public ActionResult ShopSchedule() 
{ 
    var vw = db.Weeks.OrderBy(w => w.StartDate) 
       .Include(w => w.Orders) 
       .ToList(); 
    vw.Orders = vw.Orders.OrderBy(o => o.SchedulingOrder).ToList() 
    return view(vw); 
} 
3

यह ध्यान देने योग्य है कि अन्य 2 समाधान यहाँ एसक्यूएल के माध्यम से डेटा खींच, तो स्मृति, जो दोनों क्वेरी के दौरान प्रदर्शन के मामले में बहुत बेकार है में चीजों को पुन: व्यवस्थित लायक है और पोस्ट प्रोसेसिंग। यह समाधान अतिरिक्त इन-मेमोरी चरण के बिना अकेले एसक्यूएल के माध्यम से चीजें प्राप्त करता है।

यहाँ दूसरा दृष्टिकोण में वर्णित के रूप यह किया जा सकता है: How to order child collections of entities in EF

तरह:

db.VendorProducts.Select(p => 
    new { Product = p, S = p.Schedules.OrderBy(s => s.From) }) 
    .FirstOrDefault(q => q.Product.Id == id).Product 

तो बजाय एक कथन को शामिल करें, आप संबंधित डेटा एक गुमनाम वस्तु में साथ साथ फोन मूल रूट डेटा जिसे आप लाने जा रहे थे, उसे उस सबक्वायरी में ऑर्डर करें और अंत में रूट डेटा लौटाएं। आदेश बरकरार रहता है। मुड़ गया लेकिन यह काम करता है।

अपने मूल कोड के साथ छड़ी करने के लिए:

db.Weeks.Select(w => new { W = w, O = w.Orders.OrderBy(o => o.SchedulingOrder) }) 
    .OrderBy(q => q.W.StartDate).Select(q => q.W); 
संबंधित मुद्दे