Как я могу изменить SQL-запрос на Linq 2 Nhibernate? - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть запрос, который сводит меня с ума, когда я запускаю его в sql, он работает нормально, но я не знаю, как изменить его на linq на sql

запрос:

SELECT        organizationstructure.PositionTitle.Title, organizationstructure.Person.FirstName, organizationstructure.Person.LastName, 
                     organizationstructure.Department.Name
FROM            organizationstructure.Department INNER JOIN
                     organizationstructure.Accountability AS Accountability_1 ON organizationstructure.Department.PartyId = Accountability_1.ParentPartyId INNER JOIN
                     organizationstructure.Accountability INNER JOIN
                     organizationstructure.Person ON organizationstructure.Accountability.ChildPartyId = organizationstructure.Person.PartyId INNER JOIN
                     organizationstructure.Position ON organizationstructure.Accountability.ParentPartyId = organizationstructure.Position.PartyId ON 
                     Accountability_1.ChildPartyId = organizationstructure.Position.PartyId INNER JOIN
                     organizationstructure.PositionTitle ON organizationstructure.Position.PositionTitleId = organizationstructure.PositionTitle.PositionTitleId

и я думаю, что это неправильно, но я изменил его на:

query// query is iqueryable of position
            .Join(Repository<Accountability>.Find(), p => p.Id, a => a.Child.Id,
                  (p, a) => new Tuple<string, string, int?>(((Department)a.Parent).Name, p.PositionTitle.Title, p.Id))

            .Join(Repository<Accountability>.Find(), p => p.Item3, p => p.Parent.Id,
                  (p, d) => new Tuple<string, string, int?, string>(p.Item1, p.Item2, p.Item3, d.Child == null ? string.Empty : string.Format("{0}", ((Person)d.Child).FirstName) + " " + ((Person)d.Child).LastName))

что с ним не так или я могу изменить этот запрос ??

1 Ответ

0 голосов
/ 10 октября 2011

Обычно необходимость выполнения чрезмерного количества явных объединений в linq для nhibernate является признаком того, что вы не сопоставили свою базу данных с соответствующим доменом.Без сопоставлений между объектами вы просто будете воспроизводить SQL в своем linq, что является пустой тратой времени.

В ваших сопоставлениях должны быть указаны отношения между объектами в вашем домене, например, «Person»."может иметь ссылку на" PositionTitle ".Если вы используете сопоставления для настройки отношений таким образом, ваш запрос может выглядеть примерно так:

var results = 
    from 
        p in mySession.Query<Person>
    select 
        new PersonalDetails
        {
            Title = p.PositionTitle.Title,
            FirstName = p.FirstName,
            LastName = p.LastName
            DepartmentName = p.Party.Department.Name
        };
...