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>
QueryExtender 标签的解释:
- TargetControlID 特性指定要过滤的数据源
- DataFields 特性指定要搜索的字段
- SearchType 特性的有几个常用的可选值
- ControlParameter 标签可以从各个控件中挑选搜索条件,这里是一个文本框的值
DataFields 可以指定多个字段,下面示例是同时搜索 City 和 LastName 字段:
<asp:SearchExpression DataFields="City,LastName" SearchType="StartsWith">
<asp:ControlParameter ControlID="TextBox1" />
</asp:SearchExpression>
使用 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>
使用 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>
使用 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>
定义的方法必须是静态的。必须接收和返回一个 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 命令的方法。