Как преобразовать этот SQL-запрос в LINQ или лямбда-выражение? - PullRequest
3 голосов
/ 04 октября 2010

У меня следующий запрос SQL:

SELECT C.ID, C.Name FROM Category C JOIN Layout L ON C.ID = L.CategoryID
JOIN Position P ON L.PositionID LIKE '%' + CAST(P.ID AS VARCHAR) + '%'
WHERE P.Code = 'TopMenu'

и следующие данные

Позиция:

ID      Code

1       TopMenu
2       BottomMenu

Категория

ID      Name

1       Home
2       Contact
3       About

Макет

ID      CategoryID     PositionID
1       1              1
2       2              1,2
3       3              1,2

С вышеуказанными данными , возможно ли преобразовать SQL-запрос в LINQ или Lambdaвыражение?

Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

Это может делать то, что вы хотите:

Layout
    .Where(x => Position
        .Where(y => y.Code == "TopMenu")
        .Select(y => SqlClient.SqlMethods.Like(x.PositionID, "%" + y.ID.ToString() + "%")
        ).Count() > 0
    ).Join(
        Category,
        x => x.CategoryID,
        x => x.ID,
        (o,i) => new { ID = i.ID, Name = i.Name }
    )

Хотя вы, возможно, захотите материализовать подзапрос 'Позиция', чтобы сэкономить время следующим образом:

var innerSubQuery = Position.Where(y => y.Code == "TopMenu");

Layout
    .Where(x => innerSubQuery
        .Select(y => SqlClient.SqlMethods.Like(x.PositionID, "%" + y.ID.ToString() + "%")
        ).Count() > 0
    ).Join(
        Category,
        x => x.CategoryID,
        x => x.ID,
        (o,i) => new { ID = i.ID, Name = i.Name }
    );

Однако я согласен с Джоном в том, что, чтобы действительно упростить свою жизнь, вы должны изменить способ обработки отношения «многие ко многим», создав таблицу «Layout_Position».

2 голосов
/ 04 октября 2010

Что ж, вы не сможете выразить второе объединение как объединение, потому что оно не равнозначно, но это должно быть сделано:

from c in category
join l in layout on c.Id equals l.CategoryId
from p in position
where p.Id.Contains(l.PositionId)
select new { c.Id, c.Name };

Обратите внимание, что ваше предложение "содержит / LIKE"даст вам плохие результаты, когда у вас есть более 9 позиций.Существуют лучшие подходы к отношениям «многие ко многим», чем использование списка через запятую.(Например, промежуточный стол.)

...