LINQ 2 SQL возвращает несколько как одну строку - PullRequest
0 голосов
/ 09 июля 2010

У меня есть отношение 1 ко многим между tblBusiness и tblPhone. Для конкретного BusinessID я пытаюсь вернуть одну строку информации для привязки к текстовому полю. Ниже моя последняя попытка вместе с Сгенерированным SQL из того же LINQ. Независимо от того, что я пробовал, он возвращает NULL, если нет значения для всех 3 полей.

Что я делаю не так? Спасибо!


Первый 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]

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Я сам человек LINQ to Entities, и я не уверен, сколько манипуляций со строками поддерживает поставщик 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);

Проблема с исходным запросом состоит в том, что null propogate, поэтому "blah" + NULL равно NULL.

0 голосов
/ 09 июля 2010

Пробовали ли мы:

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