2013-06-19 32 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)。

現在...在ListMembers()我給狀態「付費」和「未付」根據他們的EntryDate,但我想給他們狀態根據他們的最後付款。所以,相反的:

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是的。所以實際上它會是「如果(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"; 

,然後替換此:

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

與此:

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

這是假設總是會有一個一個支付會員。如果可能有會員沒有付款,則必須進行空檢查和左連接。