LINQ(QueryExtender 控件)

       指定 EntityDataSource 控件的 where 子句的另一个办法是使用 QueryExtender 控件。QueryExtender 控件的值非常的灵活。这个控件支持一系列选择数据的方法,其中很多是直接使用 EntityDataSource 的 where 子句很难或者根本没有办法实现的。

       QueryExtender 使用声明式语法指定过滤器,在熟悉它需要的格式前可能会觉得令人沮丧,但后续的灵活性确实对得起我们付出的努力。

 

使用 SearchExpression

       首先要看的过滤器是 SearchExpression,它搜索所有指定属性以某个表达式开头、结尾或包含某个表达式的实体类实例。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID"
    DataSourceID="EntityDataSource1">
    <Columns>
        <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" ReadOnly="True" SortExpression="EmployeeID" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
        <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
        <asp:BoundField DataField="TitleOfCourtesy" HeaderText="TitleOfCourtesy" SortExpression="TitleOfCourtesy" />
        <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
    </Columns>
</asp:GridView>
<asp:EntityDataSource ID="EntityDataSource1" runat="server" ConnectionString="name=NorthwindEntities"
    DefaultContainerName="NorthwindEntities" EnableFlattening="False" EntitySetName="Employees">
</asp:EntityDataSource>
<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="EntityDataSource1">
    <asp:SearchExpression DataFields="City" SearchType="StartsWith">
        <asp:ControlParameter ControlID="TextBox1" />
    </asp:SearchExpression>
</asp:QueryExtender>
<asp:Label ID="Label1" runat="server" Text="City:"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true"></asp:TextBox>

image

       QueryExtender 标签的解释:

  • TargetControlID 特性指定要过滤的数据源
  • DataFields 特性指定要搜索的字段
  • SearchType 特性的有几个常用的可选值
  • ControlParameter 标签可以从各个控件中挑选搜索条件,这里是一个文本框的值

       DataFields 可以指定多个字段,下面示例是同时搜索 City 和 LastName 字段:

<asp:SearchExpression DataFields="City,LastName" SearchType="StartsWith">
    <asp:ControlParameter ControlID="TextBox1" />
</asp:SearchExpression>

image

 

使用 RangeExpression

       RangeExpression 是范围表达式,要注意的是,RangeExpression 只能和单个字段一起使用。MaxType 和 MinType 的值可指定搜索的两个边界是否被包含。

<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="EntityDataSource1">
    <asp:RangeExpression DataField="EmployeeID" MaxType="Inclusive" MinType="Inclusive">
        <asp:ControlParameter ControlID="TextBox1" />
        <asp:ControlParameter ControlID="TextBox2" />
    </asp:RangeExpression>
</asp:QueryExtender>

image

      

使用 PropertyExpression

       PropertyExpression 可以过滤出那些一个或多个属性和指定的值匹配的数据。和 SearchExpression 使用的部分匹配不同,PropertyExpression 是通过 C# 的 == 关键字完成的。

<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="EntityDataSource1">
    <asp:PropertyExpression>
        <asp:ControlParameter ControlID="TextBox1" Name="City" />
        <asp:ControlParameter ControlID="TextBox2" Name="LastName" />
    </asp:PropertyExpression>
</asp:QueryExtender>

image

 

使用 MethodExpression

       这里要介绍的最后一个过滤器是最灵活的。它可以指定执行过滤时要调用的方法。这个方法里面的内容是完全开放的,但通常是 LINQ 表达式。

public class QueryExtenderMethods
{
    public static IQueryable<Employee> FilterEmployees(IQueryable<Employee> data)
    {
        return from d in data
               where d.City == "London" && d.Country == "UK"
               select d;
    }
}
<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="EntityDataSource1">
    <asp:MethodExpression TypeName="QueryExtenderMethods" MethodName="FilterEmployees" />
</asp:QueryExtender>

image

       定义的方法必须是静态的。必须接收和返回一个 IQueryable<T> ,其中 T 是要使用的实体类。TypeName 指定了方法所在的类名,MethodName 指定方法名。现在,当数据加载到 GridView 时,它首先会通过方法里的 LINQ 表达式进行过滤。

 

LINQ 系列的总结

  • LINQ 是 .NET Framework 的核心特性,非常支持C#语言。
  • 所有 LINQ 应用程序能够统一的原则是它强调声明性编程而不是功能性编程。
  • LINQ to Collections 以及 LINQ to DataSet 没有任何坏处。
  • LINQ to XML 可能是 LINQ 中最实用的部分,为开发人员提供了现代、直接的方式加载、搜索和构建 XML 文档。
  • LINQ to Entities 为开发人员提供了一个最强大的工具,但也有一些新的潜在问题。
  • 如果你不放心且不需要更强大的 LINQ to Entities 特性,那最好还是坚持使用简单直接的 ADO.NET 命令的方法。

posted on 2012-08-23 16:18  SkySoot  阅读(1092)  评论(0编辑  收藏  举报

导航