ASP.NET - расширенное предложение Where в LinqDataSource - PullRequest
4 голосов
/ 22 октября 2010

У меня есть две таблицы:

  1. Заказы
  2. OrderProducts - у заказа может быть от 1 до многих записей OrderProducts, связанных с ним.

Что я пытаюсь сделать (безуспешно) - реализовать поиск GridView с использованием LinqDataSource, в котором поиск возвращает результаты Order, где любой из столбцов OrderProduct.Manufacturer содержит поисковый запрос.

Я надеялся, что сработает следующее, однако кажется, что лямбда-выражения не работают в предложении Where в LinqDataSource (в 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?

Ответы [ 2 ]

9 голосов
/ 22 октября 2010

Я понял это. Я не осознавал этого до сих пор, но, очевидно, в предложениях 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>
0 голосов
/ 11 декабря 2014

Спасибо за ответ выше. Это действительно помогло мне!

Это также можно сделать в коде. Таким образом, можно добавить логику, чтобы включить только поля. Было бы что-то вроде этого:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...