Linq to SQL命令子集合

时间:2010-04-08 16:30:17

标签: c# linq-to-sql

有没有办法从子集合中定义默认订单列?在我的例子中,我有一个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的情况下执行此操作?

5 个答案:

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

或为这样的东西创建存储库层