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); 
     } 
} 

或类似的