2010-07-09 5 views
0

J'ai une 1 à Plusieurs relation entre tblBusiness et tblPhone. Pour un BusinessID spécifique, j'essaie de renvoyer une seule chaîne d'informations à lier à une zone de texte. Ci-dessous est ma dernière tentative avec le SQL généré à partir de ce même LINQ. Peu importe ce que j'ai essayé il renvoie NULL à moins qu'il y ait une valeur pour les 3 champs.LINQ 2 SQL Retour multiple comme chaîne unique

Qu'est-ce que je fais mal? Merci!


Première LINQ:

using (var context = ConnectDataContext.Create()) 
{ 
    context.Log = Console.Out; 

    var business = from businesse in context.tblBusinesses 
       where businesse.BusinessID == businessID 
       select businesse.BusinessName 
        + businesse.ContactName 
        + businesse.tblPhones.Select(p=>p.PhoneNumber) 
              .FirstOrDefault() 
             ?? string.Empty; 

      return business.Single(); 
} 

Maintenant, le SQL:

SELECT [t2].[value] 
FROM (
    SELECT COALESCE(([t0].[BusinessName] + [t0].[ContactName]) + ((
     SELECT TOP (1) [t1].[PhoneNumber] 
     FROM [dbo].[tblPhone] AS [t1] 
     WHERE [t1].[BusinessID] = [t0].[BusinessID] 
     )),@p0) AS [value], [t0].[BusinessID] 
    FROM [dbo].[tblBusiness] AS [t0] 
    ) AS [t2] 
WHERE [t2].[BusinessID] = @p1 
    -- @p0: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ] 
    -- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [118] 

Répondre

1

Je suis LINQ to Entities moi-même l'homme, et je ne suis pas sûr de savoir comment la manipulation beaucoup chaîne du fournisseur LINQ to SQL prend en charge, donc je ferais la concaténation de chaîne et de test null en dehors du contexte LINQ:

var business = from businesse in context.tblBusinesses 
       where businesse.BusinessID == businessID 
       select new 
       { 
        businesse.BusinessName, 
        businesse.ContactName, 
        Phone = businesse.tblPhones.Select(p=>p.PhoneNumber) 
         .FirstOrDefault() ?? string.Empty 
       }.Single(); 
return (business.BusinessName ?? string.Empty) + 
    (business.ContactName ?? string.Empty) + 
    (business.Phone ?? string.Empty); 

le problème avec la requête initiale est que les valeurs NULL se propagent, alors « bla » + NULL est NULL.

0

Avons-nous essayé:

var business = from businesse in context.tblBusinesses 
      where businesse.BusinessID == businessID 
      select (businesse.BusinessName ?? string.Empty) 
       + (businesse.ContactName ?? string.Empty) 
       + (businesse.tblPhones.Select(p=>p.PhoneNumber) 
             .FirstOrDefault() 
            ?? string.Empty); 

de Bien sûr, je devrais vraiment demander, "que faites-vous exactement après?". Les trois numéros de téléphone concaténés ensemble? Le premier des thoses non-nul? Pour ce dernier, essayez:

var business = from businesse in context.tblBusinesses 
      where businesse.BusinessID == businessID 
      select businesse.BusinessName ?? 
        businesse.ContactName ?? 
        businesse.tblPhones.Select(p=>p.PhoneNumber) 
             .FirstOrDefault() 
            ?? string.Empty; 
Questions connexes