2013-06-19 28 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(); 
} 

这是假设总是会有一个一个支付会员。如果可能有会员没有付款,则必须进行空检查和左连接。