2010-04-08 55 views
3

有沒有方法從子集合中定義默認順序列?在我的情況下,我有一個Form實體,它具有一個FormItem實體集合,稱爲FormItems。 FormItem有一個名爲DisplayOrder(int)的屬性。我想確保從方法返回的任何表單實體具有該集合的正確順序。返回結果之前有辦法做到這一點嗎?Linq to SQL有序子集合

例如,我試過,但該列表實際並不排序:

var form = context.Forms.FirstOrDefault(x => x.IsDeleted == false && x.FormName == formName); 
if (form != null) 
{ 
    form.FormItems.OrderBy(x => x.DisplayOrder); 
    // I can't even figure out a way to cast this next line so that it will compile 
    // form.FormItems = form.FormItems.OrderBy(x => x.DisplayOrder); 
} 
return form; 

有沒有辦法做到這一點,而無需使用DataLoadOptions?

回答

0

首先,將FormItems設置爲private,並在設計器中將名稱更改爲PrivateFormNames。

應該比你能夠聲明:

partial class Form 
{ 
    public IQueryable<FormItem> FormItems 
    { 
     get { return PrivateFormItems.OrderBy(x => x.DisplayOrder); } 
    } 
} 

我會認爲你是如何讓虛擬的......事情是這樣的: 您可以創建在LINQ雙字母組合形式派生類,並設置繼承以這種方式,它總是創建派生的Form類(您可以指定inheritence默認值)。

比你可以標記FormItems虛擬和在派生類中重寫它:

partial class FormDerived 
    { 
     public override IQueryable<FormItem> FormItems 
     { 
      get { return base.FormItems.OrderBy(x => x.DisplayOrder); } 
     } 
    } 

和ALL LINQ和應用程序將開始使用有序列表。只有選項才能使它無序,就是使用context.FormItems。

+0

其創造的東西reprository層不是我需要訂購的形式,但孩子收集,FormItems – 2010-04-08 16:49:00

+0

我建議另一種選擇。可以用覆蓋使它更好,但它會更復雜。請讓我知道,如果你需要這樣的幫助 – st78 2010-04-08 17:50:29

+0

繼承選項添加 – st78 2010-04-08 17:55:11

0

您可以通過部分類將一個附加屬性添加到您的Form實體中,該部分類將返回有序的FormItems

partial class Form 
{ 
    public IQueryable<FormItem> OrderedFormItems 
    { 
     get { return FormItems.OrderBy(x => x.DisplayOrder); } 
    } 
} 
+0

是的,但我寧願不創建一個自定義屬性。如果調用此代碼的代碼不知道需要排序,並且不必擔心使用OrderedFormItems而不是FormItems。如果Linq無法處理我想要的東西,這可能是最好的解決方案。 – 2010-04-08 17:03:13

0

怎麼樣:

var form2 = form.FormItems.OrderBy(x => x.DisplayOrder); return form2;

1

試試這個:

DataLoadOptions loadOptions = new DataLoadOptions(); 
loadOptions.LoadWith<Form>(f => f.FormItems); 
loadOptions.AssociateWith<Form>(f => 
    f.FormItems 
     .OrderBy(fi => fi.DisplayOrder); 
); 

context.LoadOptions = context; 

var form = context.Forms 
    .FirstOrDefault(x => 
     !x.IsDeleted && 
     x.FormName == formName 
    ); 

意義,通過DataLoadOptions.AssociateWith方法制成的子項的順序。

0

一種選擇是

public static class FormExtensions 
{ 
     public static IQueryable<FormItem> GetOrderedItems(this Form form) 
     { 
       // without lazy loading, but you have to get current context somehow 
       return CurrentContext.FormItems.Where(x => x.FormId == form.Id).OrderBy(x => x.DisplayOrder); 

       // with lazy loading 
       return form.FormItems.OrderBy(x => x.DisplayOrder); 
     } 
} 

或類似的