2010-07-09 37 views
0

我有一个1到很多关系tblBusinesstblPhone之间。对于特定的BusinessID我试图返回单个字符串信息绑定到文本框。以下是我的最新尝试以及来自同一LINQ的生成的SQL。无论我尝试过什么,它都会返回NULL,除非所有3个字段都有值。LINQ 2 SQL返回多个为单个字符串

我在做什么错?谢谢!


首先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(); 
} 

现在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] 

回答

1

我是一个LINQ到实体男人自己,我不知道的LINQ to SQL提供多少字符串操作支持,所以我会做字符串连接和空测试在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); 

原始查询的问题是空值传播,所以“blah”+ NULL为NULL。

0

有我们尝试:

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

中当然,我真的应该问,“你究竟在干什么?”。三个电话号码连在一起?第一个非空的?对于后者,请尝试:

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;