В LINQ to SQL метод Strings.Contains - это способ выражения оператора LIKE.Ниже приведен пример того, как вы можете построить шаблон фильтра вокруг оператора LIKE.Для этого примера мы дадим нашему шаблону фильтра имя «Текст».
Первым шагом является обновление метаданных динамических данных .С помощью FilterUIHintAttribute аннотируйте все столбцы, по которым вы хотите выполнять поиск, примерно так:
[FilterUIHint("Text")]
Теперь нам нужно создать шаблон фильтра «Текст».Создайте пользовательский элемент управления Text.ascx в папке шаблонов фильтров (обычно "~ / DynamicData / Filters"):
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Text.ascx.cs" Inherits="Text" %>
<asp:TextBox runat="server" ID="TextBox1" autocomplete="off" OnTextChanged="TextBox1_Changed" />
Затем создайте код позади, 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);
}
}
Обратите внимание, что мы не предоставили пользователю способа отсылать страницу назад (и, следовательно, обновить результаты) после обновления текстового фильтра.Что касается стиля, я считаю, что элементы управления TextBox, связанные с автоматической обратной передачей, сбивают с толку, и я считаю, что избыточно иметь отдельную кнопку для отправки каждого отдельного фильтра.Вместо этого я хотел бы добавить одну кнопку в шаблон страницы (например, «~ / DynamicData / PageTemplates / List.aspx»), которая позволяет пользователю отправить обратно страницу и обновить результаты.Вот соответствующая выдержка:
<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>
Это все, что нужно сделать.Теперь пользователи должны иметь возможность искать записи, которые содержат фрагменты текста в указанных столбцах.