有没有办法从子集合中定义默认订单列?在我的例子中,我有一个Form实体,它有一个名为FormItems的FormItem实体集合。 FormItem有一个名为DisplayOrder(int)的属性。我想确保从方法返回的任何Form实体都正确地订购了该集合。在返回结果之前有没有办法做到这一点?
例如,我试过这个,但列表实际上没有排序:
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 :(得分: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
方法对子项目进行排序。
答案 1 :(得分:0)
首先,将FormItem设为私有,并将名称更改为设计器中的PrivateFormNames。
比你应该能够声明:
partial class Form
{
public IQueryable<FormItem> FormItems
{
get { return PrivateFormItems.OrderBy(x => x.DisplayOrder); }
}
}
我会想你怎么能把它变成虚拟......这样的事情: 您可以在linq digram中为Form创建Derived类,并以这种方式设置继承,它总是创建派生的Form类(您可以指定inheritence default)。
您可以将FormItems标记为虚拟并在派生类中覆盖它:
partial class FormDerived
{
public override IQueryable<FormItem> FormItems
{
get { return base.FormItems.OrderBy(x => x.DisplayOrder); }
}
}
并且所有linq和应用程序将开始使用有序列表。只有使它无序的选项是使用context.FormItems。
答案 2 :(得分:0)
您可以通过将返回有序Form
的部分类向您的FormItems
实体添加其他属性。
partial class Form
{
public IQueryable<FormItem> OrderedFormItems
{
get { return FormItems.OrderBy(x => x.DisplayOrder); }
}
}
答案 3 :(得分:0)
怎么样:
var form2 = form.FormItems.OrderBy(x => x.DisplayOrder);
return form2;
答案 4 :(得分: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);
}
}
或为这样的东西创建存储库层