C# Linq到SQL有序子集合

C# Linq到SQL有序子集合,c#,linq-to-sql,C#,Linq To Sql,有没有办法从子集合定义默认订单列?在我的例子中,我有一个表单实体,它有一个名为FormItems的FormItem实体集合。FormItem有一个名为DisplayOrder(int)的属性。我希望确保我从方法返回的任何表单实体都对集合进行了正确排序。在返回结果之前,是否有方法执行此操作 例如,我尝试了这个方法,但列表实际上没有排序: var form = context.Forms.FirstOrDefault(x => x.IsDeleted == false && x

有没有办法从子集合定义默认订单列?在我的例子中,我有一个表单实体,它有一个名为FormItems的FormItem实体集合。FormItem有一个名为DisplayOrder(int)的属性。我希望确保我从方法返回的任何表单实体都对集合进行了正确排序。在返回结果之前,是否有方法执行此操作

例如,我尝试了这个方法,但列表实际上没有排序:

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的情况下执行此操作?

首先,在designer中将FormItems设置为private,并将name更改为PrivateFormNames

您应该能够声明:

partial class Form
{
    public IQueryable<FormItem> FormItems
    { 
        get { return PrivateFormItems.OrderBy(x => x.DisplayOrder); } 
    }
}
部分类形式
{
公共可查询表单
{ 
获取{return PrivateFormItems.OrderBy(x=>x.DisplayOrder);}
}
}
我会想你如何使它虚拟化。。。大概是这样的: 您可以在linq digram中为表单创建派生类,并以这种方式设置继承,使其始终创建派生表单类(您可以指定继承默认值)

然后,您可以将FormItems标记为virtual并在派生类中重写它:

 partial class FormDerived
    {
        public override IQueryable<FormItem> FormItems
        { 
            get { return base.FormItems.OrderBy(x => x.DisplayOrder); } 
        }
    }
派生的部分类
{
公共覆盖IQueryable FormItems
{ 
获取{return base.FormItems.OrderBy(x=>x.DisplayOrder);}
}
}

所有linq和应用程序将开始使用有序列表。使其无序的唯一选项是使用context.FormItems。

您可以通过将返回已排序的
FormItems
的分部类向
表单
实体添加其他属性

partial class Form
{
    public IQueryable<FormItem> OrderedFormItems
    { 
        get { return FormItems.OrderBy(x => x.DisplayOrder); } 
    }
}
部分类形式
{
公共IQueryable OrderedFormItems
{ 
获取{return FormItems.OrderBy(x=>x.DisplayOrder);}
}
}
关于:

var form2=form.FormItems.OrderBy(x=>x.DisplayOrder);
返回表格2

尝试以下操作:

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-loadOptions=newdataloadoptions();
loadOptions.LoadWith(f=>f.FormItems);
loadOptions.AssociateWith(f=>
f、 形态
.OrderBy(fi=>fi.DisplayOrder);
);
context.LoadOptions=上下文;
var form=context.Forms
.FirstOrDefault(x=>
!x.IsDeleted&&
x、 FormName==FormName
);
意思是,通过
DataLoadOptions对子项进行排序。与
方法关联。

一个选项是

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);
        }
}
公共静态类FormExtensions
{
公共静态IQueryable GetOrderedItems(此表单)
{
//没有延迟加载,但您必须以某种方式获取当前上下文
返回CurrentContext.FormItems.Where(x=>x.FormId==form.Id).OrderBy(x=>x.DisplayOrder);
//延迟加载
返回form.FormItems.OrderBy(x=>x.DisplayOrder);
}
}

或者为类似的东西创建复制层

这不是我需要订购的表单,而是子集合,FormItemsI建议了另一种选择。有可能通过覆盖使它变得更好,但它会更复杂。如果您需要此类帮助,请告诉我,但我不希望创建自定义属性。如果调用它的代码不需要排序,并且不必担心使用OrderedFormItems而不是FormItems,那就太好了。如果Linq不能处理我想要的东西,这可能是最好的解决方案。