我有一个基本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%'"
,它完美无缺。
有没有人知道这样做的方法?
答案 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>