Использование параметризованных предложений LIKE в EntityDataSource - PullRequest
3 голосов
/ 06 февраля 2011

У меня есть базовый EntityDataSource, связанный с GridView.У меня TextBox выше GridView для поиска.

Моя цель: a) Типы пользователей "jon" b) GridView` фильтруется, например, "Jonathan", "Enjona", "Jonas".

Я видел несколько примеров того, как добавить параметризованное предложение LIKE в свойство Where моего источника данных, однако всем им нужно, чтобы пользователь использовал подстановочный знак в строке поиска (например,% Jon вместо Jon).На самом деле это неприемлемо для непрофессионалов, поэтому я хочу вместо этого использовать подстановочный знак в предложении Where.

Синтаксис в SQL очевиден: SELECT Name FROM Names WHERE Name LIKE N'%@p1%'

Другими словами, если @p1='Jon', мое предложение WHERE LIKE N'%Jon%'.

К сожалению, предложение Where в EntityDataSource не работает таким образом.Другими словами, следующее не работает:

<asp:EntityDataSource ID="edsNames" runat="server" 
    ConnectionString="name=SalesEntities" 
    DefaultContainerName="SalesEntities" EntitySetName="Names"
    OrderBy="it.Name" Where="it.Name LIKE '%@p1%'">
    <WhereParameters>
        <asp:ControlParameter ControlID="txtFilter" Name="p1" 
            PropertyName="Text" Type="String" DefaultValue="" />
    </WhereParameters>
</asp:EntityDataSource>

Я бы с радостью ожидал, что значение по умолчанию "" предоставит мне мое предложение "получить все", т.е. LIKE '%%', но ничего не возвращается вmy GridView.

Разочаровывает, если я жестко закодирую результат поиска, например, Where="it.Name LIKE '%Jon%'", он отлично работает.

Кто-нибудь знает способ сделать это?

Ответы [ 3 ]

4 голосов
/ 22 мая 2012

У меня это работает так:

Where="it.Name like ('%' + @p1 + '%')"

Это работает с .NET 3.5 - я думаю, что QueryExtender плюс OnQueryCreated (это также было бы вариантом для адаптации запроса до его запуска) толькодоступно в .NET> = 4.0.

3 голосов
/ 15 января 2012

вы можете попробовать написать условие where следующим образом

Where="@p1 IS NULL OR it.Name LIKE '%@p1%'"  

на всякий случай, если оно воспринимается как нулевое значение

1 голос
/ 01 марта 2011

Вы можете сделать это с помощью QueryExtender.Что-то вроде этого:

  <asp:EntityDataSource ID="edsEmployeeSearch" runat="server" 
    ConnectionString="name=HrProtoEntities" DefaultContainerName="HrProtoEntities" 
    EnableFlattening="False" EntitySetName="People" Include="Employee" 
    AutoGenerateWhereClause="True" >
</asp:EntityDataSource>
<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="edsEmployeeSearch">
    <asp:SearchExpression SearchType="Contains" DataFields="LastName">
        <asp:ControlParameter ControlID="txtSearch" />
    </asp:SearchExpression>
</asp:QueryExtender>
...