我有两张桌子:
我想要做的(失败的)是使用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>
在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事件?
答案 0 :(得分: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>
答案 1 :(得分:0)
感谢上面的回答。它真的帮助了我!
这也可以在代码中完成。这样就可以添加逻辑,只包括需要的字段。它会是这样的:
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
答案 2 :(得分:0)
我不确定这是否对任何人有帮助,但是在综合考虑了所有以前的文章之后,在将字符串转换为“包含”之后,我仍然遇到错误。
我的名字和姓氏字段显然是字符串,但是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>