我想根据用户选择动态过滤记录。用户可以选择显示大于信用的借方金额或大于借方的贷方金额。因此,我想提出一个类似于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 _
}
如何做到这一点?
答案 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的博客下载:
VB和C#DynamicQuery 样品包括来源 辅助库的实现 这可以让你表达LINQ 查询使用扩展方法 取字符串参数而不是 类型安全的语言操作符。
您可以应用字符串来过滤执行:
myData.DynamicWhere(string.Format("{0}.Contains(\"{1}\")", filter.field, filter.data.value));