LINQ 2 SQL, неправильная генерация SQL - PullRequest
1 голос
/ 07 января 2009

У меня есть таблица БД со следующей структурой:

Id           int (identity)
Company      string
Cluster      string 
BU           string 
Department   string
SalesPoint   string 

Следующий запрос LINQ:

var chEntities = from a in dataContext.CompanyHierarchies                                 
let parent = (dataContext.CompanyHierarchies.Where(ch => ch.Id == companyHierarchyId).Single())
where 
( 
                                (a.Company == (parent.Company == null ? a.Company : parent.Company)) && 
                                (a.Cluster == (parent.Cluster == null ? a.Cluster : parent.Cluster)) &&
                                (a.Company == (parent.BU == null ? a.BU : parent.BU)) &&
                                (a.Company == (parent.Department == null ? a.Department : parent.Department)) &&
                                (a.Company == (parent.SalesPoint == null ? a.SalesPoint : parent.SalesPoint))                                   
                             ) 
                             select new CompanyHierarchyEntity 
                             { 
                                 Id = a.Id,
                                 Name = a.SalesPoint == null ? (a.BU == null ? (a.Cluster == null ? (a.Company) : a.Cluster) : a.BU) : a.SalesPoint,
                                 CompanyHierarchyLevel = (CompanyHierarchyLevel)a.HierarchyLevel,
                                 Company = a.Company, 
                                 Cluster = a.Cluster, 
                                 BU = a.BU,
                                 Department = a.Department,
                                 Section = a.SalesPoint
                             };

Создает следующий SQL

{SELECT 
(CASE
        WHEN [t0].[SalesPoint] IS NULL THEN
        (CASE 
            WHEN [t0].[BU] IS NULL THEN 
                (CASE 
                    WHEN [t0].[Cluster] IS NULL THEN [t0].[Company]
                    ELSE [t0].[Cluster]
                 END)
            ELSE [t0].[BU]
         END)
    ELSE [t0].[SalesPoint]
 END) AS [Name], [t0].[Id], [t0].[HierarchyLevel] AS [CompanyHierarchyLevel], [t0].[Company], [t0].[Cluster], [t0].[BU], [t0].[Department], [t0].[SalesPoint] AS [Section]

После этого запрос неверен. Company должно быть Company, Cluster, BU и т. Д., Но во всех случаях это Company.

FROM [dbo].[CompanyHierarchy] AS [t0]
WHERE ([t0].[Company] = (
(CASE 
    WHEN ((
        SELECT [t1].[Company]
        FROM [dbo].[CompanyHierarchy] AS [t1]
        WHERE [t1].[Id] = @p0
        )) IS NULL THEN [t0].[Company]
    ELSE (
        SELECT [t2].[Company]
        FROM [dbo].[CompanyHierarchy] AS [t2]
        WHERE [t2].[Id] = @p0
        )
  END))) AND ([t0].[Cluster] = (
 (CASE 
    WHEN ((
        SELECT [t3].[Cluster]
        FROM [dbo].[CompanyHierarchy] AS [t3]
        WHERE [t3].[Id] = @p0
        )) IS NULL THEN [t0].[Cluster]
    ELSE (
        SELECT [t4].[Cluster]
        FROM [dbo].[CompanyHierarchy] AS [t4]
        WHERE [t4].[Id] = @p0
        )
 END))) AND ([t0].[Company] = (
(CASE 
    WHEN ((
        SELECT [t5].[BU]
        FROM [dbo].[CompanyHierarchy] AS [t5]
        WHERE [t5].[Id] = @p0
        )) IS NULL THEN [t0].[BU]
    ELSE (
        SELECT [t6].[BU]
        FROM [dbo].[CompanyHierarchy] AS [t6]
        WHERE [t6].[Id] = @p0
        )
 END))) AND ([t0].[Company] = (
(CASE 
    WHEN ((
        SELECT [t7].[Department]
        FROM [dbo].[CompanyHierarchy] AS [t7]
        WHERE [t7].[Id] = @p0
        )) IS NULL THEN [t0].[Department]
    ELSE (
        SELECT [t8].[Department]
        FROM [dbo].[CompanyHierarchy] AS [t8]
        WHERE [t8].[Id] = @p0
        )
 END))) AND ([t0].[Company] = (
(CASE 
    WHEN ((
        SELECT [t9].[SalesPoint]
        FROM [dbo].[CompanyHierarchy] AS [t9]
        WHERE [t9].[Id] = @p0
        )) IS NULL THEN [t0].[SalesPoint]
    ELSE (
        SELECT [t10].[SalesPoint]
        FROM [dbo].[CompanyHierarchy] AS [t10]
        WHERE [t10].[Id] = @p0
        )
 END)))

}

Кто-нибудь еще сталкивался с подобной проблемой?

Ответы [ 2 ]

3 голосов
/ 07 января 2009

Я думаю, что это ваша проблема:

(a.Company == (parent.BU == null ? a.BU : parent.BU)) &&
(a.Company == (parent.Department == null ? a.Department : parent.Department)) &&
(a.Company == (parent.SalesPoint == null ? a.SalesPoint : parent.SalesPoint))

Не должно ли быть:

(a.BU == (parent.BU == null ? a.BU : parent.BU)) &&
(a.Department == (parent.Department == null ? a.Department : parent.Department)) &&
(a.SalesPoint == (parent.SalesPoint == null ? a.SalesPoint : parent.SalesPoint))
0 голосов
/ 09 января 2009

Я переписал ваш LINQ с эквивалентом LEFT OUTER JOIN. Я думаю, что-то вроде этого - то, что вы ищете. Я не могу проверить сгенерированный SQL, так как у меня нет вашей БД.

var chEntities = from a in dataContext.CompanyHierarchies
join parent in (from ch in dataContext.CompanHeirarchies
                where ch.Id == companyHierarchyId
                select ch) on 
    new {a.Company, a.Cluster, a.BU, a.Department, a.SalesPoint} 
    equals new {parent.Company, parent.Cluster, parent.BU, parent.Department, parent.SalesPoint} 
    into temp
from t in temp.DefaultIfEmpty()
select new CompanyHierarchyEntity
{
Id = a.Id,
Name = a.SalesPoint == null ? (a.BU == null ? (a.Cluster == null ? (a.Company) : a.Cluster) : a.BU) : a.SalesPoint, 
CompanyHierarchyLevel = (CompanyHierarchyLevel)a.HierarchyLevel,
Company = a.Company,
Cluster = a.Cluster,
BU = a.BU,
Department = a.Department,
Section = a.SalesPoint
};

Я думаю, вы могли бы добавить .Single() после подзапроса в Join, но я не уверен, как это повлияет на ваши результаты.

Дайте мне знать, если это работает!

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