【问题标题】:Databinding expression for retrieving value of related collection using LINQ使用 LINQ 检索相关集合值的数据绑定表达式
【发布时间】:2009-04-11 15:12:49
【问题描述】:

我有一个绑定到返回客户集合的 LINQDataSource 控件的 GridView。

在我的 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") %>

非常感谢您提供有关该主题的任何优秀文章的解决方案或链接。

【问题讨论】:

  • 哪些数据字段会返回您的 LinqDataSource?

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


【解决方案1】:

好吧,我不知道电话类型来自哪里,但我可能会使用代码中的方法来检索您想要的电话号码。

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

类似:

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

希望对您有所帮助。

【讨论】:

  • 这是一个模板化的数据绑定控件 -- 不能使用
【解决方案2】:

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

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

两件事:

  • Where 将为您提供一个列表,并且您对单个可选结果感兴趣,即 FirstOrDefault 或 SingleOrDefault
  • 如果你只使用FirstOrDefault,然后直接使用.PhoneNumber,那么在没有找到手机时会因为空引用而失败

对此我不确定,但您可能需要更改为:

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

也就是说,它会导致每一行的往返。因此,请考虑更改选择,以便它抓住电话。在这种情况下,您只需绑定到检索到的字段。当然,您需要使用类似于上面的表达式,但在 select 内部:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多