C# Linq到SQL有序子集合
有没有办法从子集合定义默认订单列?在我的例子中,我有一个表单实体,它有一个名为FormItems的FormItem实体集合。FormItem有一个名为DisplayOrder(int)的属性。我希望确保我从方法返回的任何表单实体都对集合进行了正确排序。在返回结果之前,是否有方法执行此操作 例如,我尝试了这个方法,但列表实际上没有排序: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
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不能处理我想要的东西,这可能是最好的解决方案。