2009-04-11 9 views
0

J'ai un GridView lié à un contrôle LINQDataSource qui renvoie une collection de clients.Expression de liaison de données pour la récupération de la valeur de la collection associée à l'aide de LINQ

Dans mon DataGrid, je dois afficher le numéro de téléphone d'un client, s'il en a un. Les numéros de téléphone d'un client sont stockés dans une table distincte avec une clé étrangère pointant vers la table client.

L'expression de liaison suivante me obtient le premier numéro de téléphone pour un client:

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

je dois comprendre comment obtenir le numéro de téléphone à domicile spécifiquement (filtre en fonction du type de téléphone) et gérer le scénario dans lequel le client n'a pas de téléphone à la maison dans la base de données. À l'heure actuelle, il y a exception si le client n'a pas de numéro de téléphone.

J'ai essayé d'utiliser l'opérateur Où avec une expression lambda pour filtrer le type de téléphone, mais il ne fonctionne pas:

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

Solutions ou des liens vers tous les bons articles sur le sujet serait très apprécié.

+0

Quels champs de données renvoie votre LinqDataSource? – eKek0

Répondre

0

Eh bien, je ne sais pas où le type de téléphone arrive, mais ce que je pourrais faire est d'utiliser une méthode dans le code derrière pour récupérer le numéro de téléphone que vous voulez.

Cette méthode doit être de type string, ici, vous pouvez vérifier si elle existe vraiment un numéro de téléphone pour le type de numéro de téléphone et le client que vous suplying.

Quelque chose comme:

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

et à l'intérieur de la page ASPX:

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

Hope this aide.

+0

Il s'agit d'un contrôle de base de données basé sur un modèle - ne peut pas utiliser <% =, doit être <% #. Cela dit, l'approche par méthode est un bon moyen.Sauf que je passerais probablement simplement l'objet Conteneur, ferais le cast de type et travaillerais à partir de là. – Ruslan

0

Je ne l'ai pas utilisé le LinqDataSource (toujours par code LINQ), mais le premier que je voudrais faire est de changer l'expression:

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

2 choses:

  • Où vous donnera une liste, et vous êtes intéressant dans un seul résultat en option, qui est soit FirstOrDefault ou SingleOrDefault
  • Si vous utilisez directement seulement FirstOrDefault puis .PhoneNumber, il échouerait à cause de la référence null lorsque aucun téléphone est trouvé

Je ne suis pas sûr à ce sujet, mais vous aurez probablement changer quelque chose comme:

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

Cela dit, il causerait un aller-retour pour chaque ligne. Donc, regardez à changer à la place, donc il attrape le téléphone. Dans ce cas, vous devez simplement lier le champ récupéré. Bien sûr, vous devrez utiliser une expression comme celle ci-dessus, mais à l'intérieur du select :)

Questions connexes