FilterExpression не работает, когда одним из параметров является DateTime

У меня проблема с получением FilterExpression для правильной работы в SqlDataSource. Столбец Date в SqlDatabase, NewsDate, представляет собой DateTime. Текстовый столбец NewsSubject в SqlDataBase является varchar. Вот выражение FilterExpression:

FilterExpression="[NewsSubject] LIKE '%{0}%' AND [NewsDate] = '{1}'"

И параметры управления показаны ниже:

<FilterParameters>
           <asp:ControlParameter ControlID="txtNewsSubjectFilter" Name="NewsSubject" Type="String" ConvertEmptyStringToNull="False"    />
         <asp:ControlParameter ControlID="txtNewsDateFilter" Name="NewsDate" Type="DateTime"  PropertyName="Text"   />
         </FilterParameters>

Ожидаемые результаты - это фильтр для обоих столбцов. Это только фильтрация по дате.

Если я возьму параметр Date ControlParameter и изменим выражение фильтра, чтобы оно использовалось только для NewsSubject, оно отлично работает для NewsSubject (см. Выражение фильтра ниже:)

 FilterExpression="[NewsSubject] LIKE '%{0}%'"

У кого-нибудь есть идеи? или это ошибка в Microsoft WebForms?

1 ответ

Мы закончили настройкой FilterExpression в событии OnFiltering в коде этой страницы. Мы удалили часть выражения, которая имела дело с датой и параметром, если текстовое поле фильтра даты не было заполнено (см. FormFiltering ExpressionforDate).

        protected void NewsDataSource_OnFiltering(object sender, SqlDataSourceFilteringEventArgs e)
    {
        var newsDateClause = FormFilteringExpressionforDate(e, "NewsDate");
        var firstConnector = FormConjunction(newsDateClause);
        var newsSubjectClause = FormFilteringExpressionForString(e, "NewsSubject");

        var filterExpression = string.Format("{0}{1}{2}", newsDateClause, firstConnector, newsSubjectClause);

        var sqlDataSourceView = sender as SqlDataSourceView;
        if (sqlDataSourceView == null)
            return;

        sqlDataSourceView.FilterExpression = filterExpression;
    }

    private string FormConjunction(string clause)
    {
        return clause == string.Empty ? "" : " AND ";
    }

    private string FormFilteringExpressionForString(SqlDataSourceFilteringEventArgs e, string columnName)
    {
        return string.Format("{0} LIKE '%{1}%' ", columnName, e.ParameterValues[columnName]);
    }

    private string FormFilteringExpressionforDate(SqlDataSourceFilteringEventArgs e, string columnName)
    {
        var columnValue = e.ParameterValues[columnName];

        if (columnValue == null)
        {
            e.ParameterValues.Remove(columnName);
            return string.Empty;
        }

        var convertedColumnValue = ((DateTime)columnValue).ToString("MM/dd/yyyy");

        var dateClause = string.Format("{0} = '{1}'", columnName, convertedColumnValue);           
        return dateClause;
    }

Вот код разметки (нам нужно было сохранить FilterExpression, определенный в SqlDataSource, как заполнитель... преобразование не сработало):

        <asp:SqlDataSource ID="NewsDataSource" runat="server"     OnFiltering="NewsDataSource_OnFiltering"
        ConflictDetection="CompareAllValues" 
        ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
        SelectCommand="SELECT * FROM [News]" 
        FilterExpression="CONVERT([NewsDate], 'System.String') LIKE '%{0}%' AND [NewsSubject] LIKE '%{1}%'"
        OldValuesParameterFormatString="original_{0}" 
        ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" >
        <FilterParameters>
            <asp:ControlParameter ControlID="txtNewsDateFilter" Name="NewsDate" Type="DateTime" />
            <asp:ControlParameter ControlID="txtNewsSubjectFilter" Name="NewsSubject" Type="String" ConvertEmptyStringToNull="False" />
        </FilterParameters>

Другие вопросы по тегам