簡體   English   中英

ASP.NET - LinqDataSource 中的高級 Where-Clause

[英]ASP.NET - Advanced Where-Clause in LinqDataSource

我有兩個表:

  1. 訂單
  2. OrderProducts - 一個訂單可以有 1 到多個與其關聯的 orderProducts 記錄。

我想要做的(未成功)是使用 LinqDataSource 實現 GridView 搜索,其中搜索返回 Order 結果,其中任何 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>

我得到的錯誤是:

“orderProduct”類型中不存在任何屬性或字段“op”

關於如何在 LinqDataSource 定義中實現這一點的任何線索,或者我是否必須處理和設置自定義 OnSelecting 事件?

我想到了。 直到現在我才意識到這一點,但顯然 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>

謝謝樓上的回答。 它真的幫助了我!

這也可以在代碼中完成。 這樣可以添加邏輯以僅包含需要的字段。 它會是這樣的:

    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

我不確定這是否對任何人有幫助,但是在綜合了之前的所有帖子后,在轉換為“包含”的字符串后,我仍然收到錯誤消息。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM