2011-10-28 2 views
1

Je la déclaration LINQ suivanteAccès aux objets dans un datalist par Linq

from DataListItem dli in dlAttachments.Items 
select new Objects.BHAttachment 
{ 
    Name = ((FileUpload)dli.FindControl("fuAttachment")).HasFile ? ((FileUpload)dli.FindControl("fuAttachment")).FileName : (((HyperLink)dli.FindControl("hypCurrentAttachment")).Text != null ? ((HyperLink)dli.FindControl("hypCurrentAttachment")).Text : ""), 
    Path = ((FileUpload)dli.FindControl("fuAttachment")).HasFile ? ((FileUpload)dli.FindControl("fuAttachment")).PostedFile.FileName : "", 
    FileUpload = ((FileUpload)dli.FindControl("fuAttachment")).HasFile ? ((FileUpload)dli.FindControl("fuAttachment")) : new FileUpload(), 
    DocumentType = ((Label)dli.FindControl("lblType")).Text, 
    URL = "" 
} 

Et ça marche très bien. Ma question concerne la re-référence constante de l'objet FileUpload. Je recréais (et je le relis) 6 fois. Y at-il un moyen de le définir une fois dans Linq et se référer à cet objet unique?

Répondre

3

Vous pouvez utiliser l'instruction let pour créer une variable

from DataListItem dli in dlAttachments.Items 
let x = ((FileUpload)dli.FindControl("fuAttachment")) 
select new Objects.BHAttachment 
{ 
    Name = (x.HasFile ? (x.FileName : (((HyperLink)dli.FindControl("hypCurrentAttachment")).Text != null ? ((HyperLink)dli.FindControl("hypCurrentAttachment")).Text : "") 
} 
+0

OOoooooooo :-D Merci !! –

+0

Vos parenthèses sont désactivées ... "(" avant x.FileName n'est pas approprié ... –

2

Oui, via le let clause. Vous pouvez le faire pour tous vos objets:

from DataListItem dli in dlAttachments.Items 
let fileUpload = dli.FindControl("fuAttachment") as FileUpload 
let hyperlink = dli.FindControl("hypCurrentAttachment") as Hyperlink 
let label = dli.FindControl("lblType") as Label 
select new Objects.BHAttachment 
{ 
    Name = fileUpload.HasFile ? fileUpload.FileName : (hyperlink.Text ?? ""), 
    ... 
+0

OOoooooooo :-D Merci !! –