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

Kei*_*ith 4 c# linq vb.net asp.net linq-to-sql

我有两张桌子:

  1. 命令
  2. OrderProducts - 订单可以包含1到多个与之关联的orderProducts记录.

我想要做的(失败的)是使用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>
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

"orderProduct"类型中不存在属性或字段"op"

关于如何在LinqDataSource定义中使用它的任何线索,还是我必须处理和设置自定义OnSelecting事件?

Kei*_*ith 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>
Run Code Online (Sandbox Code Playgroud)