[英]ASP.NET - Advanced Where-Clause in LinqDataSource
我有兩個表:
我想要做的(未成功)是使用 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.