c#基于业务对象的筛选

我们主要是使用List<T>.FindAll(Predicate<T> match)进行筛选

其中Predicate<T>类型的参数,封装了筛选的规则。Predicate<T>是一个泛型委托,这意味着match参数是一个返回bool类型的方法,在FindAll()内部,会调用我们传递进去的这个方法。

public delegate bool Predicate<T>(T obj);

在讲述之前我们需要先复习一下几个概念

首先理解一下什么叫多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

多态性通过派生类覆写基类中的虚函数型方法来实现

来个例子:

 

abstract   class  MyAbs
      {
         
public   abstract   void  AbMethod1();
         
public   abstract   void  AbMethod2();
     }
     
class  MyClass1 : MyAbs
      {
         
public   override   void  AbMethod1()
          {
             Console.WriteLine(
" Abstarct method #1 of MyClass1 " );
         }
         
public   override   void  AbMethod2()
          {
             Console.WriteLine(
" Abstarct method #2 of MyClass1 " );
         }
     }
     
class  MyClient
      {
         
public   static   void  Main()
          {
             MyAbs ma1 
=   new  MyClass1(); //  这里就是多态
             ma1.AbMethod1();
             ma1.AbMethod2();
         }
     }

然后我们看下 如何来实现基于业务对象的筛选,主要来自 jimmyzhang的文章

页面上的代码

 

     < asp:ObjectDataSource ID = " objdsOrderList "  runat = " server "  SelectMethod = " GetList "  TypeName = " OrderManager "  OnSelecting = " objdsOrderList_Selecting " >
     
< SelectParameters >
      
< asp:Parameter Name = " fullList "  Type = " Object "   />
       
< asp:Parameter Name = " filter "  Type = " Object "   />

     
</ SelectParameters >
     
</ asp:ObjectDataSource >
        
< asp:DropDownList ID = " ddlYear "  runat = " server "  OnSelectedIndexChanged = " ddlYear_SelectedIndexChanged "  AutoPostBack = " True " >
            
< asp:ListItem Value = " 0 " > 全部 </ asp:ListItem >
            
< asp:ListItem > 2011 </ asp:ListItem >
        
</ asp:DropDownList >
        
< asp:DropDownList ID = " ddlMonth "  runat = " server "  OnSelectedIndexChanged = " ddlMonth_SelectedIndexChanged "  AutoPostBack = " True " >
        
< asp:ListItem Value = " 0 " > 全部 </ asp:ListItem >
        
</ asp:DropDownList >
        
< asp:DropDownList ID = " ddlDay "  runat = " server "  OnSelectedIndexChanged = " ddlDay_SelectedIndexChanged "  AutoPostBack = " True " >
        
< asp:ListItem Value = " 0 " > 全部 </ asp:ListItem >
        
</ asp:DropDownList >
        
< asp:DropDownList ID = " ddlCountry "  runat = " server "  AutoPostBack = " True " >
        
< asp:ListItem Value = " 0 " > 国家 </ asp:ListItem >
        
        
< asp:ListItem Value = " 中国 " > 中国 </ asp:ListItem >
        
< asp:ListItem Value = " 法国 " > 法国 </ asp:ListItem >
        
</ asp:DropDownList >< br  />
        
< asp:GridView ID = " gvOrderList "  runat = " server "  DataSourceID = " objdsOrderList " >
                    
< Columns >
                
< asp:BoundField DataField = " orderid "  HeaderText = " 订单ID "   />
                
< asp:BoundField DataField = " customerid "  HeaderText = " 客户ID "   />
                
< asp:BoundField DataField = " orderdate "  HeaderText = " 订单日期 "   />
                
< asp:BoundField DataField = " country "  HeaderText = " 国家 "   />
            
</ Columns >
        
</ asp:GridView >

 

主要看下 objectdatasouce  里面的typename表示使用的类,parameter是select方法的两个参数,首先会调用这个方法来绑定。

看下后台代码:

 

  protected   void  Page_Load( object  sender, EventArgs e)
    {
        
if  ( ! IsPostBack)
        {
            AppendListItem(ddlMonth, 
12 );
            AppendListItem(ddlDay, 
31 );
        }
    }



    
public   int  Year
    {
        
get  {  return  Convert.ToInt32(ddlYear.SelectedValue); }
    }

    
public   int  Month
    {
        
get  {  return  Convert.ToInt32(ddlMonth.SelectedValue); }
    }

    
public   int  Day
    {
        
get  {  return  Convert.ToInt32(ddlDay.SelectedValue); }
    }

    
public   string  Country
    {
        
get  {  return  ddlCountry.SelectedItem.Text.ToString(); }
    }

    
// 获取查询语句
     public   string  QuerySql
    {
        
get
        {
            
int  year  =  Year;
            
int  month  =  Month;
            
int  day  =  Day;

            List
< string >  sqlList = new  List < string > ();
            
string  subSql  =   string .Empty;

            
if  (year  !=   0 )
            {
                sqlList.Add(
string .Format( " Year(orderdate)={0} " , year));
            }

            
if  (month  !=   0 )
            {
                sqlList.Add(
string .Format( " Month(orderdate)={0} " , month));
            }

            
if  (day  !=   0 )
            {
                sqlList.Add(
string .Format( " Day(orderdate)={0} " , day));
            }

            
if  (sqlList.Count  >   0 ) // 如果选择了任意一个下拉框,那么就拼装SQL语句
            {
                
string [] list  =  sqlList.ToArray();
                subSql 
=   "  where ( "   +   string .Join( "  and  " , list)  +   " ) " ;
            }

            
return   " select customerid,country,orderdate,orderid from Orders  "   +  subSql;
        }
    }



    
// 为列表添加项目

    
protected   void  AppendListItem(ListControl list,  int  end)
    {
        
for  ( int  i  =   1 ; i  <=  end; i ++ )
        {
            list.Items.Add(
new  ListItem(i.ToString()));
        }
    }


    
protected   void  objdsOrderList_Selecting( object  sender, ObjectDataSourceSelectingEventArgs e)
    {
        
// e.InputParameters["query"] = QuerySql;

        e.InputParameters[
" fulllist " =  OrderManager.GetList(); //  获取全部列表
        e.InputParameters[ " filter " =  Filter;

    }

    
protected   void  ddlYear_SelectedIndexChanged( object  sender, EventArgs e)
    {
        gvOrderList.DataBind();
    }
    
protected   void  ddlMonth_SelectedIndexChanged( object  sender, EventArgs e)
    {
        gvOrderList.DataBind();
    }
    
protected   void  ddlDay_SelectedIndexChanged( object  sender, EventArgs e)
    {
        gvOrderList.DataBind();
    }





    
public  DateFilter < Order >  Filter
    {
        
get
        {
            DateFilter
< Order >  filter  =   new  OrderFilter(Year, Month, Day,Country);
            
return  filter;
        }
    }

 

还有用于筛选的类  后面我会放上全部代码  其中sqlhelper类 大家直接用微软的就OK  我就不贴了  直接放上 几个类的代码/Files/danyingjie/App_Code.rar

希望对您有帮助。

你可能感兴趣的:(C#)