En LINQ to SQL, el método Strings.Contains es cómo se expresa el operador LIKE. Lo que sigue es un ejemplo de cómo puede compilar un filter template alrededor del operador LIKE. Para este ejemplo, le daremos a nuestra plantilla de filtro personalizada el nombre "Texto". El primer paso es actualizar el Dynamic Data metadata. Anotar todas las columnas que desea ser capaz de buscar en la FilterUIHintAttribute así:
[FilterUIHint("Text")]
Ahora tenemos que crear la plantilla de filtro de "texto". Crear el control de Text.ascx usuario en la carpeta de plantillas de filtro (habitualmente "~/DynamicData/Filtros"):
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Text.ascx.cs" Inherits="Text" %>
<asp:TextBox runat="server" ID="TextBox1" autocomplete="off" OnTextChanged="TextBox1_Changed" />
A continuación, cree el código subyacente, Text.ascx.cs:
public partial class Text : QueryableFilterUserControl {
public override Control FilterControl {
get { return TextBox1; }
}
protected void TextBox1_Changed(object sender, EventArgs e) {
OnFilterChanged();
}
public override IQueryable GetQueryable(IQueryable source) {
var value = TextBox1.Text;
if (String.IsNullOrWhiteSpace(value)) return source;
if (DefaultValues != null) {
DefaultValues[Column.Name] = value;
}
var parameter = Expression.Parameter(source.ElementType);
var columnProperty = Expression.PropertyOrField(parameter, Column.Name);
var likeValue = Expression.Constant(value, typeof (string));
var condition = Expression.Call(
columnProperty,
typeof (string).GetMethod("Contains"),
likeValue);
var where = Expression.Call(
typeof (Queryable),
"Where",
new[] { source.ElementType },
source.Expression,
Expression.Lambda(condition, parameter));
return source.Provider.CreateQuery(where);
}
}
Observe que no hemos proporcionado ninguna forma para que el usuario registre la página (y, por lo tanto, actualice los resultados) después de actualizar el filtro de texto. Como cuestión de estilo, me parece que TextBox controla esa devolución automática de mensajes para que sea confusa, y considero que es redundante tener un botón por separado para devolver cada filtro individual. En cambio, me gusta agregar un solo botón a la plantilla de la página (por ejemplo, "~/DynamicData/PageTemplates/List.aspx") que permite al usuario realizar una devolución de la página y actualizar los resultados. Aquí está el extracto relevante:
<asp:Panel runat="server" DefaultButton="UpdateFilter">
<asp:QueryableFilterRepeater runat="server" ID="FilterRepeater">
<ItemTemplate>
<asp:Label runat="server" Text='<%# Eval("DisplayName") %>' OnPreRender="Label_PreRender" />
<asp:DynamicFilter runat="server" ID="DynamicFilter" OnFilterChanged="DynamicFilter_FilterChanged" /><br />
</ItemTemplate>
</asp:QueryableFilterRepeater>
<asp:Button runat="server" ID="UpdateFilter" Text="Search" />
</asp:Panel>
Eso es todo lo que hay que hacer. Los usuarios ahora deberían poder buscar registros que contengan fragmentos de texto en las columnas especificadas.
¿Qué hace el botón UpdateFilter para que los filtros se actualicen? Cuando implemento este botón, simplemente no hace nada cuando hago clic en él. – jpierson
@jpierson Todo lo que hace el botón es causar una devolución de página de la página. Durante el ciclo de vida de la página de la devolución de datos, debe activarse 'TextBox1_Changed', que es lo que realmente desencadena una actualización de los filtros. Si tiene problemas, debe verificar que realmente se está llamando a 'TextBox1_Changed'. –