用于使用LINQ检索相关集合的值的数据绑定表达式

时间:2009-04-11 15:12:49

标签: asp.net linq-to-sql data-binding

我有一个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>

我需要弄清楚如何专门获取家庭电话号码(根据电话类型过滤)并处理客户在数据库中没有家庭电话的情况。现在,如果客户没有任何电话号码,它会超出范围异常。

我尝试使用带有lambda表达式的Where运算符来过滤手机类型,但它不起作用:

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

非常感谢有关该主题的任何好文章的解决方案或链接。

2 个答案:

答案 0 :(得分:0)

好吧,我不知道电话类型的来源,但我可能会在后面的代码中使用一种方法来检索你想要的电话号码。

该方法应该是字符串类型,在这里您可以检查是否确实存在电话号码和您正在提供的客户的电话号码。

类似的东西:

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) %>

希望得到这个帮助。

答案 1 :(得分:0)

我没有使用linqdatasource(总是通过linq代码),但我要做的第一件事是将表达式更改为:

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

2件事:

  • 哪里会给你一个列表,你对一个可选的结果感兴趣,它是FirstOrDefault或SingleOrDefault
  • 如果你只使用FirstOrDefault然后直接使用.PhoneNumber,那么当没有找到手机时由于空引用会失败

我不确定这一点,但您可能需要更改为:

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

那就是说,它会导致每一行的往返。所以转而选择更改选择,以便抓住手机。在这种情况下,您只需绑定到检索到的字段。当然,您需要使用类似上面的表达式,但在select:)