代码之家  ›  专栏  ›  技术社区  ›  Keith

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

  •  4
  • Keith  · 技术社区  · 14 年前

    我有两张桌子:

    1. 命令
    2. OrderProducts—一个订单可以有1到多个与之关联的OrderProducts记录。

    我希望下面的语句可以工作,但是lambda表达式似乎不能在LinqDataSource(在VB中)的Where子句中工作:

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

       <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事件吗?

    2 回复  |  直到 14 年前
        1
  •  9
  •   Keith    14 年前

    我想出来了。我直到现在才意识到这一点,但显然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>
    
        2
  •  0
  •   Ethan    10 年前

    谢谢你的回答。它真的帮助了我!

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

        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
    
        3
  •  0
  •   Steve B    5 年前

    我的名字和姓氏字段显然是字符串,但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>