2017-09-04 10 views
0

私は、このSQLコードを持っている:LINQ - 左参加し、グループ化、合計、

select A.Recurso_Id, sum(case when B.cita_id is null then 0 else 1 end) as Total_Eventos, 
a.Recurso_Nombre, a.Recurso_Email,a.Recurso_Activo 
from Agenda_Recurso a left join Agenda_Cita B 
on A.Recurso_Id=B.Recurso_Id 
group by A.Recurso_Id,a.Recurso_Nombre, a.Recurso_Email,a.Recurso_Activo 

そして、私は実際に私はこのコードを持って、きゅうにtraslateする必要があります。

List<Select> _ListaSelect = (from R in _LstRecursos 
           join C in _LstCitas 
           on R.Id equals C.Recurso_Id 
           group R by new {C.Recurso_Id, R.Nombre} into total 
           select new Select() 
           { 
            Cantidad_Eventos = total.Sum(R=> R.Id), 
            Recurso_Nombre= total.Max(R=> R.Nombre), 
            Recurso_Email=total.Max(R=>R.Email), 
            Recurso_Activo=total.Max(R=>R.Activo), 
            Id_Recurso=total.Max(R=>R.Id) 
           }).ToList(); 

しかし、それは動作しません。手伝って頂けますか?私はあなたのクエリは非常に簡単になることができると思い

+2

どのように*動作していないかを説明してください。 –

+0

LINQ 'join'はデフォルトで内部結合を使用します。 SQLクエリでは、左結合が使用されます。そういうわけで、あなたは別の結果を得ています。 LINQの左外部結合を取得するには、x.DefaultIfEmpty()のパターンから 'join ... in ... on ...をxから... into 'パターンにする必要があります。 – MarcinJuraszek

+0

この場合、Resource_Idから来るすべてのものを追加して、どのようなアポイントメントにリソースが関連付けられているかを知りたいのですが、それはリソース番号をすべて追加することです。 – Broodwing009

答えて

1

してみてください。この

var citasbyRecurso = 
      from r in recs 
      join c in citas on r.RecursoID equals c.RecursoID into cleft 
      select new 
      { 
       RecursoID = r.RecursoID, 
       Name = r.Name, 
       Email = r.Email, 
       Count = cleft.Where(x=>x.RecursoID == 
       r.RecursoID).Count(), 
      }; 

これは、あなたがコンソールアプリでこのクエリを実行することができます完全surceコードある

class Program 
{ 
    static void Main(string[] args) 
    { 
     var recs = new List<Recursos> { 
new Recursos { Name = "Alex", Email = "A", RecursoID= 1 }, 
new Recursos { Name = "Juan", Email = "B", RecursoID= 2 }, 
new Recursos { Name = "Peter", Email = "C", RecursoID= 3 }, 
new Recursos { Name = "Julios", Email = "D", RecursoID= 4 }, 
new Recursos { Name = "Dennis", Email = "E", RecursoID= 5 }, 
new Recursos { Name = "Jhon", Email = "F", RecursoID= 6 }, 
}; 
     var citas = new List<Citas> { 
new Citas { RecursoID= 1, CitaID = 1 }, 
new Citas { RecursoID= 1, CitaID = 2 }, 
new Citas { RecursoID= 2, CitaID = 3 }, 
}; 

     var citasbyRecurso = 
      from r in recs 
      join c in citas on r.RecursoID equals c.RecursoID into cleft 
      select new 
      { 
       RecursoID = r.RecursoID, 
       Name = r.Name, 
       Email = r.Email, 
       Count = cleft.Where(x=>x.RecursoID == r.RecursoID).Count(), 
      }; 

     foreach (var item in citasbyRecurso) 
     { 
      Console.WriteLine(string.Format("{0} {1} {2} {3}", item.RecursoID,item.Name,item.Email, item.Count)); 
     } 
     Console.ReadLine(); 
    } 
} 

class Recursos 
{ 
    public int RecursoID; 
    public string Name; 
    public string Email; 
} 

class Citas 
{ 
    public int RecursoID; 
    public int CitaID; 
} 
+0

大変ありがとうございました。私は必要なもの、ありがとう、それは本当に働いた.... – Broodwing009

関連する問題