Выражение привязки данных для получения значения связанной коллекции с использованием LINQ - PullRequest
0 голосов
/ 11 апреля 2009

У меня есть GridView, который связан с элементом управления LINQDataSource, который возвращает коллекцию клиентов.

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

Следующее связующее выражение дает мне первый номер телефона для клиента:

<asp:TemplateField HeaderText="LastName" SortExpression="LastName">
   <ItemTemplate>
      <asp:Label ID="PhoneLabel" runat="server" Text='<%# Eval("Phones[0].PhoneNumber") %>'></asp:Label>
   </ItemTemplate>
</asp:TemplateField>

Мне нужно выяснить, как конкретно получить номер домашнего телефона (фильтр по типу телефона) и справиться со сценарием, когда у клиента нет домашнего телефона в базе данных. Прямо сейчас это исключение вне диапазона, если у клиента нет никаких телефонных номеров.

Я пытался использовать оператор Where с лямбда-выражением для фильтрации типа телефона, но он не работает:

<%# Eval("Phones.Where(p => p.PhoneTypeId == 2).PhoneNumber") %>

Решения или ссылки на любые хорошие статьи на эту тему будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2009

Я не использовал linqdatasource (всегда через код linq), но сначала я бы изменил выражение на:

Phones.Select(p=>p.PhoneNumber).FirstOrDefault(p => p.PhoneTypeId == 2) ")

2 вещи:

  • Где вы получите список, и вас интересует один необязательный результат - FirstOrDefault или SingleOrDefault
  • Если вы используете только FirstOrDefault, а затем напрямую .PhoneNumber, произойдет сбой из-за пустой ссылки, когда телефон не найден

Я не уверен в этом, но вам, вероятно, придется перейти на что-то вроде:

<%# ((IQueryable(Phone)) Eval("Phones")).Select...

Тем не менее, это приведет к поездке туда и обратно для каждого ряда. Так что обратите внимание на изменение выбора, чтобы захватить телефон. В этом случае вы просто привязываетесь к найденному полю. Конечно, вам нужно использовать выражение, подобное приведенному выше, но внутри select:)

0 голосов
/ 11 апреля 2009

Ну, я не знаю, куда поступает тип телефона, но я мог бы использовать метод в коде для получения нужного номера телефона.

Этот метод должен иметь тип string, здесь вы можете проверить, действительно ли существует номер телефона для типа номера телефона и клиента, которого вы предоставляете.

Что-то вроде:

public string GetPhoneNumber(int phoneTypeId, int customerId)
{
    string result = "";
    if (existsPhoneFor(phoneTypeId, customerId)
      result = GetPhoneFor(phoneTypeId, customerId);
    return result;
}

и внутри страницы aspx:

<%= GetPhoneNumber(p.PhoneTypeId, c.CustomerId) %>

Надеюсь, эта помощь.

...