在EntityDataSource中使用参数化的LIKE子句

时间:2011-02-05 23:44:03

标签: c# asp.net gridview sql-like entitydatasource

我有一个基本EntityDataSource绑定到GridView。我在TextBox之上GridView进行搜索。

我的目标: a)用户类型“jon” b)过滤GridView`,例如“乔纳森”, “Enjona”, “乔纳斯”。

我已经看到了几个如何将参数化LIKE子句添加到我的数据源的Where属性的示例,但是他们都需要用户在搜索字符串中使用通配符(例如%Jon而不是Jon)。这对于非专业用户来说并不是真的可以接受,所以我想把通配符放在Where子句中。

SQL中的语法很明显:SELECT Name FROM Names WHERE Name LIKE N'%@p1%'

换句话说,如果@p1='Jon',我的WHERE子句就像LIKE N'%Jon%'

令人沮丧的是,EntityDataSource中的Where子句似乎没有这种方式。换句话说,以下内容不起作用:

<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>

我很高兴地希望默认值“”为我提供“get everything”子句,即LIKE '%%',但我的GridView中没有返回任何内容。

令人沮丧的是,如果我对搜索结果进行硬编码,例如Where="it.Name LIKE '%Jon%'",它完美无缺。

有没有人知道这样做的方法?

3 个答案:

答案 0 :(得分:4)

我得到了这样的工作:

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

这适用于.NET 3.5 - 我认为QueryExtender加OnQueryCreated(这也是在运行之前调整查询的选项)仅在.NET&gt; = 4.0中可用。

答案 1 :(得分:3)

您可以尝试编写where条件,如下所示

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

以防它被视为空值

答案 2 :(得分:1)

您可以使用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>