2013-06-19 2 views
0

데이터베이스의 두 테이블에서 데이터를 가져옵니다.데이터베이스에서 가져온 다른 클래스 속성에 따라 클래스 속성에 데이터 제공

표 1 - 회원 :

 public List<Member> ListMembers() 
     { 
      List<Member> Members = new List<Member>(); 

      string SELECT = "SELECT * FROM Members ORDER BY Id"; 

      using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) 
      { 
       sqlConnection.Open(); 

       using (SqlCommand sqlCommand = new SqlCommand(SELECT, sqlConnection)) 
       { 
        var sqlReader = sqlCommand.ExecuteReader(); 

        while (sqlReader.Read()) 
        { 
         var member = new Member 
         { 
          Id = Convert.ToInt32(sqlReader["Id"]), 
          Name = sqlReader["Name"].ToString(), 
          Surname = sqlReader["Surname"].ToString(), 
          EntryDate = Convert.ToDateTime(sqlReader["EntryDate"]) 
         }; 

         if (member.EntryDate < DateTime.Today) 
         { 
          member.Status = Status.Unpaid.ToString(); 
         } 

         else 
         { 
          member.Status = Status.Paid.ToString(); 
         } 

         Members.Add(member); 
        } 
       } 
      } 

      return Members; 
     } 

표 2 - 지불 :

 public List<Payment> ListPayments(Payment entity) 
     { 
      List<Payment> Payments = new List<Payment>(); 

      string SELECT = "SELECT * FROM Payments WHERE Id = @Id"; 

      using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) 
      { 
       sqlConnection.Open(); 

       using (SqlCommand sqlCommand = new SqlCommand(SELECT, sqlConnection)) 
       { 
        sqlCommand.Parameters.Add("@Id", SqlDbType.Int).Value = entity.Id; 

        var sqlReader = sqlCommand.ExecuteReader(); 

        while (sqlReader.Read()) 
        { 
         var payment = new Payment 
         { 
          Id = Convert.ToInt32(sqlReader["Id"]), 
          Amount = Convert.ToDecimal(sqlReader["Amount"]), 
          StartDay = Convert.ToDateTime(sqlReader["StartDay"]), 
          EndDay = Convert.ToDateTime(sqlReader["EndDay"]) 
         }; 

         Payments.Add(payment); 
        } 
       } 
      } 

      return Payments; 
     } 

지불의 ID는 특정 회원의 ID와 동일합니다. (회원 ID가 100 인 경우 모든 지불금은 동일한 ID 100을가집니다).

Now ... ListMembers() Status2는 EntryDate에 따라 Statuses에 "유료"와 "지불하지 않음"을 주었지만 최종 지급액에 따라 상태를 제공하려고합니다. 그래서, 대신 :

if (member.EntryDate < DateTime.Today) 
{ 
    member.Status = Status.Unpaid.ToString(); 
} 

이 있어야한다 :

if (lastPayment < DateTime.Today) // lastPayment is just a word I'm using, It's not declared anywhere, I don't know how to get that value. 
{ 
    member.Status = Status.Unpaid.ToString(); 
} 

정말 여기 잃었어요이, 누군가가 나를 도울 수 있습니까? 나는 무엇을해야할지 모른다.

+0

"lastPayment"가 가장 최근의 'EndDay'가있는 것이 맞습니까? –

+0

@ColmPrunty 예. 그래서 실제로 "if (theLastEndDay Etrit

+0

이 작업을 수행 했습니까? –

답변

0

가져 오기 멤버 지불 :

public List<Payment> GetMemberPaymnets(int memberId) 
    { 
     List<Payment> Payments = new List<Payment>(); 

     string SELECT = "SELECT ID,AMOUNT,STARTDAY,ENDDAY FROM Payments WHERE Id = @Id order by endday desc"; 

     using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) 
     { 
      sqlConnection.Open(); 

      using (SqlCommand sqlCommand = new SqlCommand(SELECT, sqlConnection)) 
      { 
       sqlCommand.Parameters.Add("@Id", SqlDbType.Int).Value = entity.Id; 

       var sqlReader = sqlCommand.ExecuteReader(); 

       while (sqlReader.Read()) 
       { 
        var payment = new Payment 
        { 
         Id = Convert.ToInt32(sqlReader["Id"]), 
         Amount = Convert.ToDecimal(sqlReader["Amount"]), 
         StartDay = Convert.ToDateTime(sqlReader["StartDay"]), 
         EndDay = Convert.ToDateTime(sqlReader["EndDay"]) 
        }; 

        Payments.Add(payment); 
       } 
      } 
     } 

     return Payments; 
    } 

대신

if (member.EntryDate < DateTime.Today) 
{ 
    member.Status = Status.Unpaid.ToString(); 
} 

의이

foreach(Member memeber in memeberList) 
{ 
     List<Payment> memberPayments=GetMemberPayments(member.Id); 
     //also you need to check that memberPayments.Count>0 
     if(memberPayments[0].EndDay<DateTime.Today) 
     { 
      member.Status = Status.Unpaid.ToString(); 
     } 
} 

같은 것을 사용할 수 있습니다하지만 당신은 회원 지불로 일부 작업을 할 필요가없는 경우에 당신이 할 수있는 구성원 ID별로 구성원 지불 상태 상태를 리턴하는 데이터베이스 메소드를 작성하십시오.

0

Member 검색어로 최신 지급일을 받으실 수 있습니다. 대신

string SELECT = "SELECT * FROM Members ORDER BY Id"; 

string SELECT = "SELECT m.Id, m.Name, 
m.Surname, m.EntryDate, MAX(p.EndDay) AS EndDay FROM Members m 
JOIN Payments p ON p.Id = m.Id 
ORDER BY m.Id"; 

을 시도하고이 대체 :

var endDate = Convert.ToDateTime(sqlReader["EndDay"]) 
if (endDate < DateTime.Today) 
{ 
    member.Status = Status.Unpaid.ToString(); 
} 

이 항상 하나 개의 지불이있을 것이라고 가정이와

if (member.EntryDate < DateTime.Today) 
{ 
    member.Status = Status.Unpaid.ToString(); 
} 

을 회원. 지불이없는 회원이있는 경우, 일부 null 점검 및 왼쪽 결합을 수행해야합니다.

관련 문제