ASP.NET - LinqDataSource中的高级Where子句

时间:2010-10-21 20:02:40

标签: c# asp.net vb.net linq linq-to-sql

我有两张桌子:

  1. 订单
  2. OrderProducts - 订单可以包含1到多个与之关联的orderProducts记录。
  3. 我想要做的(失败的)是使用LinqDataSource实现GridView搜索,其中搜索返回订单结果,其中任何OrderProduct.Manufacturer列包含搜索查询。

    我希望以下内容可行,但看起来lambda表达式在LinqDataSource的Where子句中不起作用(在VB中):

        <asp:LinqDataSource ID="dsOrders" runat="server" ContextTypeName="myDataContext" TableName="orders"
            Where="orderProducts.Any(Function(op) op.Manufacturer.Contains(@searchTerm))">
            <WhereParameters>
                <asp:ControlParameter Name="searchTerm" ControlID="txtSearchTerm" DefaultValue="" />
            </WhereParameters>
        </asp:LinqDataSource>
    

    在C#中它看起来像:

       <asp:LinqDataSource ID="dsOrders" runat="server" ContextTypeName="myDataContext" TableName="orders"
            Where="orderProducts.Any(op => op.Manufacturer.Contains(@searchTerm))">
            <WhereParameters>
                <asp:ControlParameter Name="searchTerm" ControlID="txtSearchTerm" DefaultValue="" />
            </WhereParameters>
        </asp:LinqDataSource>
    

    我得到的错误是:

      

    没有属性或字段'op'   输入'orderProduct'

    有关如何在LinqDataSource定义中实现此功能的任何线索,还是我必须处理和设置自定义OnSelecting事件?

3 个答案:

答案 0 :(得分:9)

我明白了。直到现在我才意识到这一点,但显然LinqDataSource select / where / etc子句使用的语法与标准Linq不同。我需要做的就是下面的内容(以及其他清理工作)。希望这有助于未来的其他人:

    <asp:LinqDataSource ID="dsOrders" runat="server" ContextTypeName="myDataContext" TableName="orders"
        Where='@searchTerm = "" OR Convert.ToString(orderID) = @searchTerm OR orderProducts.Any(Manufacturer.Contains(@searchTerm))'>
        <WhereParameters>
            <asp:ControlParameter Name="searchTerm" ControlID="txtSearchTerm" DefaultValue="" ConvertEmptyStringToNull="false" />
        </WhereParameters>
    </asp:LinqDataSource>

答案 1 :(得分:0)

感谢上面的回答。它真的帮助了我!

这也可以在代码中完成。这样就可以添加逻辑,只包括需要的字段。它会是这样的:

    Protected Sub dsOrders_Selecting(sender As Object, e As LinqDataSourceSelectEventArgs) Handles dsOrders.Selecting

       Dim searchTerm = txtSearchTerm.Text.Trim()

       dsOrders.Where += " orderProducts.Any(Manufacturer.Contains(""" + searchTerm + """)) "

    End Sub

答案 2 :(得分:0)

我不确定这是否对任何人有帮助,但是在综合考虑了所有以前的文章之后,在将字符串转换为“包含”之后,我仍然遇到错误。

我的名字和姓氏字段显然是字符串,但是EntityID是Int32。我已经设置了这些控件参数,以便从网页上的文本框中获取值进行搜索,但仍然不断收到Int32字符串方法错误。

这对我有用。

<asp:LinqDataSource ID="LDSCandidateEdit" runat="server" ContextTypeName="ATSIntake.ATSIntakeDataContext" EntityTypeName="" TableName="Candidates"
       EnableDelete="True" EnableInsert="True" EnableUpdate="True"

    Where='(FirstName.Contains(@searchTermF)) and (LastName.Contains(@searchTermL)) and (Convert.ToString(EntityID).Contains(@searchTermCID))'>

    <WhereParameters>
        <asp:ControlParameter Name="searchTermF" ControlID="txtFirstNameSearch" DefaultValue="" ConvertEmptyStringToNull="false" />
        <asp:ControlParameter Name="searchTermL" ControlID="txtLastNameSearch" DefaultValue="" ConvertEmptyStringToNull="false" />
        <asp:ControlParameter Name="searchTermCID" ControlID="txtCandidateIDSearch" DefaultValue="" ConvertEmptyStringToNull="false"/>
    </WhereParameters>
</asp:LinqDataSource>