linq查询动态添加where条件?

时间:2010-09-03 11:36:47

标签: vb.net linq

我想根据用户选择动态过滤记录。用户可以选择显示大于信用的借方金额或大于借方的贷方金额。因此,我想提出一个类似于totDebit>totCredit or TotCredit> totDebit`的条件

Dim query = _
        From product In Bills.AsEnumerable() _
        Group product By accode = product.Field(Of String)("ACCODE"), _
        BILLNO = product.Field(Of String)("BILLNO") Into g = Group _
        Let totDebit = g.Sum(Function(proudct) proudct.Field(Of Decimal)("DEBIT")) _
        Let totCredit = g.Sum(Function(proudct) proudct.Field(Of Decimal)("CREDIT")) _
        Select New With _
         { _
            .ACCODE = accode, _
            .billno = BILLNO, _
            .TOTALDEBIT = totDebit, _
            .TOTALCREDIT = totCredit, _
            .BALNACE = totDebit - totCredit _
          }

如何做到这一点?

2 个答案:

答案 0 :(得分:2)

在你所展示的代码中,你只是构建了一个查询;你还没有执行它。并且,在您执行它之前的任何时候,您可以继续构建它:

 Dim query = _ 
    From product In Bills.AsEnumerable() _ 
    Group product By accode = product.Field(Of String)("ACCODE"), _
   ' etc as above....

   If onlyCredits Then
       query = query.Where(Function(proudct) product.TOTALCREDIT > product.TOTALDEBIT)
   Elseif onlyDebits Then
       query = query.Where(Function(proudct) product.TOTALCREDIT < product.TOTALDEBIT)
   Endif

注意,我是C#家伙,所以请原谅轻微的语法错误....

答案 1 :(得分:1)

我认为您正在寻找动态查询库。不包含在Linq中,但可以从Scott Guthrie的博客下载:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

  

VB和C#DynamicQuery   样品包括来源   辅助库的实现   这可以让你表达LINQ   查询使用扩展方法   取字符串参数而不是   类型安全的语言操作符。

您可以应用字符串来过滤执行:

myData.DynamicWhere(string.Format("{0}.Contains(\"{1}\")", filter.field, filter.data.value));