【问题标题】:ASP.NET - Advanced Where-Clause in LinqDataSourceASP.NET - LinqDataSource 中的高级 Where 子句
【发布时间】:2011-04-28 19:57:50
【问题描述】:

我有两张桌子:

  1. 订单
  2. OrderProducts - 一个订单可以关联 1 到多个 orderProducts 记录。

我正在尝试做的(未成功)是使用 LinqDataSource 实现 GridView 搜索,其中搜索返回 Order 结果,其中任何 OrderProduct.Manufacturer 列都包含搜索查询。

我希望以下内容可以工作,但似乎 lambda 表达式在 LinqDataSource(在 VB 中)的 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>

我得到的错误是:

中不存在属性或字段“op” 输入“订单产品”

关于如何在 LinqDataSource 定义中使其工作的任何线索,或者我是否必须处理和设置自定义 OnSelecting 事件?

【问题讨论】:

    标签: c# asp.net vb.net linq linq-to-sql


    【解决方案1】:

    我想通了。直到现在我才意识到这一点,但显然 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>
    

    【讨论】:

    • 您能否分享语法来源以供参考.. 如何编写这些 where 原因和其他关系,如 DataContenxt.Users.Where(u => u.UserPackages.Any(p => p .Status == "订阅活动"))
    • 对于任何比我在原始答案中提到的更高级的内容,您始终可以覆盖 LinqDataSource 实例的 Selecting 事件,并完全控制您需要的确切数据。
    • @Keith 你能帮忙回答这个问题吗:stackoverflow.com/questions/25353225/…
    【解决方案2】:

    感谢以上回答。它真的帮助了我!

    这也可以在代码中完成。这样可以添加逻辑以仅包含需要的字段。应该是这样的:

        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
    

    【讨论】:

      【解决方案3】:

      我不确定这是否对任何人有帮助,但在综合了之前的所有帖子之后,在转换为“包含”的字符串后,我仍然遇到错误。

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

      【讨论】:

        猜你喜欢
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多