2010-10-21 60 views
4

我有兩個表:ASP.NET - 先進的WHERE子句中的LinqDataSource

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

我所試圖做的(失敗)是使用的LinqDataSource其中搜索返回結果進行排序,其中任何OrderProduct.Manufacturer列包含搜索查詢來實現GridView的搜索。

我希望下面會的工作,但它似乎lambda表達式不(在VB)一個的LinqDataSource的Where子句中工作:

<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'

有關如何在LinqDataSource定義中使用此工作的任何線索,還是必須處理和設置自定義的OnSelecting事件?

回答

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> 
+0

可以請你分享語法參考源..怎麼寫這些,其中的原因和其他像DataContenxt.Users.Where(U => u.UserPackages.Any關係(p => p.Status ==「Subscription Active」)) – 2014-02-10 06:52:02

+0

對於任何比我在原始答案中提到的更先進的東西,您總是可以覆蓋LinqDataSource實例的Selecting事件,並完全控制您的確切數據需要。 – Keith 2014-02-10 15:24:23

+0

@凱思你能否幫忙回答這個問題: http://stackoverflow.com/questions/25353225/how-do-i-use-entitydatasource-or-linqdatasource-with-a-union-clause – Simua 2014-08-19 09:14:11

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