EntityDataSource在查询中替换* with%wildcard

时间:2011-01-08 05:24:31

标签: asp.net entity-framework-4

我有一个在许多地方使用EntityDataSource的应用程序。

在EDS中,我根据TextBox'es的用户输入手动构建Where子句。

我希望用户在查询数据时能够输入“*”(星号)而不是“%”。

使用Entity SQL或EDS本身进行搜索/替换是否容易?我知道在输入数据后我实际上可以更改TextBox,但是当用户看到他的文本从*更改为%时,我认为他不会理解。

我尝试过使用T-SQL Replace命令,并执行以下操作:

<asp:EntityDataSource ID="EDSParts" runat="server" 
    ConnectionString="name=TTEntities" DefaultContainerName="TTEntities"
    EnableFlattening="False" EntitySetName="Parts"
    OrderBy="it.ID DESC"
    Where ="(CASE
                WHEN (@PartNumber IS NOT NULL) THEN
                    it.[Number] LIKE REPLACE(@PartNumber, "*", "%")
                ELSE
                    it.[ID] IS NOT NULL
            END)">
    <WhereParameters>
        <asp:ControlParameter Name="PartNumber" Type="String"
            ControlID="txtPartNumberQuery" PropertyName="Text" />
    </WhereParameters>
</asp:EntityDataSource>

但是我得到了“服务器标签形成不好”的消息。我在Entity SQL参考中找不到等效的“替换”函数....

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以处理页面回发并修改txtPartNumberQuery的内容。 EntityDataSource只能用于%(因为它构建了ESQL查询),因此在执行数据绑定之前必须在代码隐藏中将*更改为%。

答案 1 :(得分:1)

Sluama - 你的建议修好了!这么明显的答案。 “正在终止Where子句字符串。我可以发誓我试过了,但我猜不是。因为我刚刚回到这个问题并看到了你的答案而且有效!

<asp:EntityDataSource ID="EDSParts" runat="server"
    ConnectionString="name=TTEntities" DefaultContainerName="TTEntities"
    EnableFlattening="False" EntitySetName="Parts"
    OrderBy="it.ID DESC"
    Where ="(CASE
                WHEN (@PartNumber IS NOT NULL) THEN
                    it.[Number] LIKE REPLACE(@PartNumber, '*', '%')
                ELSE
                    it.[ID] IS NOT NULL
             END)">
    <WhereParameters>
        <asp:ControlParameter Name="PartNumber" Type="String"
            ControlID="txtPartNumberQuery" PropertyName="Text" />
    </WhereParameters>
</asp:EntityDataSource>