Linq to SQL заказал дочернюю коллекцию - PullRequest
3 голосов
/ 08 апреля 2010

Есть ли способ определить столбец заказа по умолчанию из дочерней коллекции? В моем случае у меня есть сущность Form, у которой есть коллекция сущностей FormItem, называемая FormItems. 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 ]

1 голос
/ 21 мая 2010

Попробуйте это:

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 голосов
/ 16 мая 2011

Один вариант будет

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

или создайте слой репозитория для подобных вещей

0 голосов
/ 08 апреля 2010

Вы можете добавить дополнительное свойство к вашей сущности Form через частичный класс, который будет возвращать упорядоченный FormItems.

partial class Form
{
    public IQueryable<FormItem> OrderedFormItems
    { 
        get { return FormItems.OrderBy(x => x.DisplayOrder); } 
    }
}
0 голосов
/ 21 мая 2010

а как же:

var form2 = form.FormItems.OrderBy(x => x.DisplayOrder); return form2;

0 голосов
/ 08 апреля 2010

Во-первых, сделайте FormItems частными и измените имя на PrivateFormNames в конструкторе.

Чем вы должны быть в состоянии объявить:

partial class Form
{
    public IQueryable<FormItem> FormItems
    { 
        get { return PrivateFormItems.OrderBy(x => x.DisplayOrder); } 
    }
}

Я подумаю, как сделать это виртуальным ... Как-то так: Вы можете создать производный класс для Form в linq digram и установить наследование таким образом, чтобы он всегда создавал производный класс Form (можно указать наследование по умолчанию).

Чем вы можете пометить FormItems как виртуальный и переопределить его в производном классе:

 partial class FormDerived
    {
        public override IQueryable<FormItem> FormItems
        { 
            get { return base.FormItems.OrderBy(x => x.DisplayOrder); } 
        }
    }

и ВСЕ linq и приложение начнут использовать упорядоченный список. Единственный способ получить его неупорядоченным будет использовать context.FormItems.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...