(Linq to SQL) Почему мой Concat не работает? - PullRequest
0 голосов
/ 13 августа 2010

То, что я пытаюсь сделать, - это поиск по нескольким таблицам (которые не связаны между собой), и каждый раз, когда он находит совпадение, создайте новый более общий тип «Results»

для каждой таблицы - соответствует этот набор типов результатов. Я получаю ошибку: Все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь одинаковое количество выражений в своих целевых списках.

Самое смешное, что Concat работает на 2 столах, но третий не работает. Вот профиль SQL

Рабочая

exec sp_executesql N'SELECT [t2].[Id], [t2].[value] AS [Type], [t2].[Name] AS     [Description], [t2].[value2] AS [Action]
FROM (
SELECT [t0].[Id], @p1 AS [value], [t0].[Name], @p2 AS [value2]
FROM [dbo].[PLID] AS [t0]
WHERE [t0].[Name] LIKE @p0
UNION ALL
SELECT [t1].[Id], @p4 AS [value], [t1].[Number], @p5 AS [value2]
FROM [dbo].[Phone] AS [t1]
WHERE [t1].[Number] LIKE @p3
) AS [t2]',N'@p0 nvarchar(6),@p1 nvarchar(4),@p2 nvarchar(5),@p3 nvarchar(6),@p4 nvarchar(9),@p5 nvarchar(5)',    @p0=N'%2010%',@p1=N'PLID',@p2=N'Phone',@p3=N'%2010%',@p4=N'Telephone',@p5=N'Phone'

Не работает

exec sp_executesql N'SELECT [t2].[Id], [t2].[value] AS [Type], [t2].[Name] AS [Description], [t2].[value2] AS [Action]
FROM (
SELECT [t0].[Id], @p1 AS [value], [t0].[Name], @p2 AS [value2]
FROM [dbo].[PLID] AS [t0]
WHERE [t0].[Name] LIKE @p0
UNION ALL
SELECT [t1].[Id], @p4 AS [value], [t1].[LastName]
FROM [dbo].[Employee] AS [t1]
WHERE [t1].[LastName] LIKE @p3
) AS [t2]',N'@p0 nvarchar(6),@p1 nvarchar(4),@p2 nvarchar(5),@p3 nvarchar(6),@p4 nvarchar(8)',@p0=N'%2010%',@p1=N'PLID',@p2=N'Phone',@p3=N'%2010%',@p4=N'Employee'

Вот фактический код c # (рабочий)

public IQueryable<TelephonySearchResults> SearchPhones(string search)
    {
        IQueryable<TelephonySearchResults> results = from phone in _dataContext.Phones
                                                     where phone.Number.Contains(search)
                                                     select new TelephonySearchResults
                                                                {
                                                                    Description = phone.Number,
                                                                    Type = SearchTelephonyResultsType.Phone,
                                                                    Id = phone.Id,
                                                                    Action = "Phone"
                                                                };


        return results;
    }

    public IQueryable<TelephonySearchResults> SearchPlids(string search)
    {
        IQueryable<TelephonySearchResults> results = from plid in _dataContext.PLIDs
                                                     where plid.Name.Contains(search)
                                                     select new TelephonySearchResults
                                                                {
                                                                    Description = plid.Name,
                                                                    Type = SearchTelephonyResultsType.Plid,
                                                                    Id = plid.Id,
                                                                    Action = "Phone"
                                                                };


        return results;
    }

Не работает

public IQueryable<TelephonySearchResults> SearchEmployees(string search)
    {

        IQueryable<TelephonySearchResults> results = from employee in _dataContext.Employees
                                                     where employee.LastName.Contains(search)
                                                     select new TelephonySearchResults
                                                     {
                                                         Description = employee.LastName,
                                                         Type = SearchTelephonyResultsType.Employee,
                                                         Id = employee.Id,
                                                         Action = "Employee"
                                                     };

        return results;
    }

И код, который их объединяет

IQueryable<TelephonySearchResults> phones = _repository.SearchPhones(searchCriteria);
        IQueryable<TelephonySearchResults> plids = _repository.SearchPlids(searchCriteria);
        IQueryable<TelephonySearchResults> employees = _repository.SearchEmployees(searchCriteria);

//works
        IQueryable<TelephonySearchResults> results = plids.Concat(phones);
//does not
IQueryable<TelephonySearchResults> results = plids.Concat(employees);

Насколько я могу судить, все выглядит одинаково в коде, но в профилировщике SQL единственное отличие состоит в том, что нет "p5 AS [value2]", как на рабочем

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 13 августа 2010

Получаете ли вы те же результаты, если объединяете телефоны и сотрудников вместе?

Я бы также попытался исключить свойство Type из TelephonySearchResults, что-то в моей интуиции говорит мне, что может иметь какое-то отношение к этой проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...