Вопрос о синтаксисе LINQ - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть этот оригинальный SQL, который мне нужно переписать в LINQ:

SELECT 
    luProfiles.luProfileID,
    luProfiles.ProfileName,
    NoOfRights = (SELECT Count(pkProfileRightsID) FROM tblProfileRights WHERE fkProfileID = luProfileID)
FROM  luProfiles 
WHERE luProfiles.ProfileName LIKE ...

Я сделал большую часть этого в LINQ, но я не уверен, как добавить часть NoOfRights в мой LINQ.Это то, что я сделал до сих пор:

return from p in _database.LuProfiles
       where p.ProfileName.ToLower().StartsWith(strProfile.ToLower())             
       select p; 

Кто-нибудь может сказать мне правильный синтаксис для включения части NoOfRights в мой LINQ?

Ответы [ 4 ]

3 голосов
/ 21 апреля 2011
from p in _database.LuProfiles
let NoOfRights = (from r in database.tblProfileRights 
                  where r.fkProfileID == p.luProfileID
                  select r).Count()
where p.ProfileName.ToLower().StartsWith(strProfile.ToLower())             
select new
{
    p.luProfileID,
    p.ProfileName,
    NoOfRights 
};
2 голосов
/ 21 апреля 2011

Если вы используете LINQ-to-SQL или EF и у вас настроен FK, у вас должно быть свойство навигации ProfileRights.В этом случае вы можете сделать запрос следующим образом:

from p in _database.LuProfiles
where p.ProfileName.ToLower().StartsWith(strProfile.ToLower())
select new 
{
    p.ProfileId,
    p.ProfileName,
    NoOfRights = p.ProfileRights.Count()
};
1 голос
/ 21 апреля 2011

Я бы порекомендовал вам сначала изменить SQL на что-то вроде этого:

SELECT 
  luProfiles.luProfileID,
  luProfiles.ProfileName,
  NoOfRights = COUNT(pkProfileRightsID)
FROM luProfiles
LEFT JOIN tblProfileRights ON fkProfileID = luProfileID
WHERE luProfiles.ProfileName like ...
GROUP BY luProfiles.luProfileID, luProfiles.ProfileName

Так что это может быть легко преобразовано в LINQ:

return from p in _database.LuProfiles
join o in p.Profiles on p.luProfileID equals o.fkProfileID
group p by new { p.luProfileID, p.ProfileName } into g
select new { g.Key.luProfileID, g.Key.ProfileName , g.Count() }

(не проверено, так что сделайте сами)

1 голос
/ 21 апреля 2011

Я думаю, это поможет вам:

from l in luProfiles
where l.ProfileName.Contains(something)
select new
{
    l.luProfileID,
    l.ProfileName,
    noOfRights = tblProfileRights.Count(t => t.fkProfileID == l.luProfileID)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...