2012-09-21 1 views
1

나 자신이 작성하지 않은 다음 SQL을 Linq to Entity 쿼리로 변환하려고합니다. SQL을 LINQ에서 엔터티로 변환

select 
    u.user_Id, 
    u.forename, 
    u.surname, 
    u.client_code, 
    u.user_name, 
    u.password, 
    u.email, 
    u.gender, 
    u.Report_Date, 
    u.EmailDate, 
    count(ut.test_Id) as testcount, 
    sum(cast(isnull(ut.completed,0) as int)) as Testcompleted, 
    u.job_function, 
    lu.lookupvalue 
from 
users u inner join user_Relationship ur 
    on u.user_Id= ur.child_Id  
left join user_tests ut 
    on ut.user_id=u.user_id 
inner join lookup lu on u.first_languageId = lu.lookupid 
where ur.parent_Id = @Parent_Id 
group by 
    u.user_Id, u.forename,u.surname,u.client_code,u.user_name, u.password, 
    u.email, u.gender, u.first_languageId, u.Report_Date,u.EmailDate, 
    u.job_function, lu.lookupvalue 

지금까지, 나는이 작업을 수행 할 수 있었다 :

from u in db.Users 

join ur in db.User_Relationship on u.User_ID equals ur.Child_ID 

join ut in db.User_Tests on u.User_ID equals ut.User_ID into ps 
from ut in ps.DefaultIfEmpty() 

join lu in db.Lookups on u.First_LanguageID equals lu.LookupID 

where ur.Parent_ID == 45875 

select new UserViewModel 
{ 
    User_ID = u.User_ID, 
    Forename = u.Forename, 
    Surname = u.Surname, 
    Client_Code = u.Client_Code, 
    User_Name = u.User_Name, 
    Password = u.Password, 
    Email = u.Email, 
    Gender = u.Gender, 
    Report_Date = u.Report_date, 
    Email_Date = u.EmailDate, 
    //Insert Test_Count and Test_Completed 
    Job_Function = u.Job_Function, 
    Lookup_Value = lu.LookupValue 
}); 

어떻게 SQL의 GroupCount() 기능을 복제합니까?

+0

영원히해야 할 일이 있다면. 왜? – marko

답변

0

글쎄,이 솔루션을 테스트하기위한 환경은 아직 없다. co2.이 솔루션을 테스트하기위한 환경은 분명히 있지만 grouping은 linq에서 수행하는 방법을 알게 될 것이다.

from u in db.Users 

join ur in db.User_Relationship on u.User_ID equals ur.Child_ID 

join ut in db.User_Tests on u.User_ID equals ut.User_ID into ps 
from ut in ps.DefaultIfEmpty() 

join lu in db.Lookups on u.First_LanguageID equals lu.LookupID 

where ur.Parent_ID == 45875 group new{u,lu} by new {u.User_ID,u.Forename, 
          u.Surname,u.Client_Code, 
          u.User_Name,u.Password, 
          u.Email,u.Gender,u.Report_date, 
          u.EmailDate,u.Job_Function, 
          lu.LookupValue} into g 
let Test_Count = ps.Count(x=>x.test_Id) 
let Test_Completed = ps.Sum(x=>x.completed) 
select new UserViewModel 
         { 
          User_ID = g.Key.User_ID, 
          Forename = g.Key.Forename, 
          Surname = g.Key.Surname, 
          Client_Code = g.Key.Client_Code, 
          User_Name = g.Key.User_Name, 
          Password = g.Key.Password, 
          Email = g.Key.Email, 
          Gender = g.Key.Gender, 
          Report_Date = g.Key.Report_date, 
          Email_Date = g.Key.EmailDate, 
          Test_Count = Test_Count, 
          Test_Completed = Test_Completed, 
          Job_Function = u.Job_Function, 
          Lookup_Value = lu.LookupValue 
         }); 
+0

이것은 정말 도움이됩니다, 감사합니다! 그룹화가 어떻게 작동하는지 훨씬 더 잘 이해합니다. 나는 아직도 Test_Count와 Test_Completed에 문제가있다. 나는 그들이 그들이 불법이라고 언급하지 않았고 나는 그것들의 총수를 사실로 되 돌리려고 노력하고있다. – user1688784

+0

나는 진실에 대해 당신을 얻지 못했습니까 ?? 당신은'count> 0'이 당신이 반환하기를 원하는 것이라는 것을 의미합니까 ?? – FosterZ

+0

죄송합니다. 테이블이 없으면 약간 불분명합니다. 그룹화가 없으면 동일한 정보를 가지고 있지만 Test_ID가 다른 여러 UserViewModel 항목이 결과로 반환됩니다. 완료된 테스트의 수를 얻으려고합니다. SQL 쿼리에 대한 내 이해는 Completed에 대한 부울을 계산하여 총 완료 테스트 수를 제공한다는 것입니다. Test_Count의 경우이 값은 User_ID에 연결된 테스트의 수입니다. 원하는 것을 지우는 희망. – user1688784