Использование Linq-to-SQL и динамических данных.

На экране редактирования динамических данных в раскрывающемся списке перечислены возможные значения внешнего ключа.

Мне нужно отфильтровать значения, перечисленные в этом раскрывающемся списке, предпочтительно добавив предложение where в запрос linq-to-sql.

Любые идеи?

4
Leon van der Walt 8 Мар 2010 в 18:23

3 ответа

Лучший ответ

Что ж, я нашел место для настройки этого, хотя до сих пор не нашел способа переопределить или расширить запрос linq для загрузки данных:

В файле \ DynamicData \ FieldTemplates \ ForeignKey_Edit.ascx.cs (в соответствии с расположением по умолчанию) в методе Page_Load выполняется следующий вызов:

PopulateListControl(DropDownList1);

Его можно полностью заменить вашим собственным кодом. В моем случае я сначала проверил, реализует ли текущая таблица определенный мною пользовательский интерфейс. Если это так, используйте это, чтобы получить данные для привязки раскрывающегося списка, иначе передайте управление PopulateListControl.

Используя Reflector, кажется, что PopulateListControl в конечном итоге использует MetaTable.GetQuery () для получения запроса списка по умолчанию для таблицы. Было бы неплохо сделать это вместо этого ... но теперь перейдем к другим вещам!

5
Leon van der Walt 10 Мар 2010 в 12:07

Думаю, вы уже решили свою проблему, но я хочу зарегистрировать свое решение, на случай, если оно кому-то поможет!

Я пошел по предложенному вами пути, отредактировав ForeignKey_Edit.ascx.cs. После строки PopulateListControl (DropDownList1) я вызываю метод RemoveResultsFromOtherUsers ().

Вот способ:

    private void RemoveResultsFromOtherUsers()
    {
        using (var db = new FinWeb3.DynamicData.FinWebDBDataContext())
        {
            var data = db.GetTable(this.Column.Provider.ColumnType);
            var removableItems = new List<ListItem>();

            foreach (var item in data)
            {
                var dbItem = item as IDbEntity;

                if (dbItem.UserName != this.Context.User.Identity.Name)
                {
                    removableItems.Add(
                        DropDownList1.Items.FindByValue(dbItem.Id.ToString()));
                }
            }

            foreach (var item in removableItems)
            {
                DropDownList1.Items.Remove(item);
            }
        }
    }

IDbEntity - это интерфейс, который реализуют все мои классы linq to sql. Этот интерфейс имеет свойства Id и UserName. Здесь я намерен удалить результаты, которые не зарегистрированы текущим аутентифицированным пользователем.

Спасибо за вопрос и решение!

4
Tiago Deliberali Santos 12 Апр 2010 в 06:32

Я бы создал настраиваемый шаблон поля, который является пользовательским веб-элементом управления, и ссылался бы на него в метаданных с помощью UIHintAttribute. Примечание: вам нужно будет создать стандартную версию (обычно гиперссылку) и версию _Edit (обычно раскрывающийся список).

0
Ash Machine 11 Сен 2014 в 02:30