• 主页
  • VBS
  • .NET技术
  • VBA
  • VB网络编程
  • VB多媒体
  • VB数据库
  • VB控件
  • VB COM/DCOM
  • VB基础类
  • VB API

自己写的LINQ代码,感觉有点冗余,请帮忙改写一下,100分送上

无言无忌 2017-04-13 09:29:45
函数的功能是返回数据库某个表中指定字段大于0的记录数。

Private Function SubjectScoreInNum(ByVal iTestID as Integer, ByVal strSubject As String) As Integer
Private hmzx As New HMZXEntities()
Dim iInNumber = 0
Select Case strSubject
Case "语文"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.Chinese2 > 0
Into Count()
iInNumber = num
Case "数学"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.Maths2 > 0
Into Count()
iInNumber = num
Case "英语"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.English2 > 0
Into Count()
iInNumber = num
Case "物理"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.Physics2 > 0
Into Count()
iInNumber = num
Case "化学"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.Chemistry2 > 0
Into Count()
iInNumber = num
Case "生物"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.Biology2 > 0
Into Count()
iInNumber = num
Case "政治"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.Politics2 > 0
Into Count()
iInNumber = num
Case "历史"
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.History2 > 0
Into Count()
iInNumber = num
Case Else
Dim num = Aggregate ts In hmzx.Grade3TestScore
Where ts.TestID = iTestID And ts.Geography2 > 0
Into Count()
iInNumber = num
End Select
SubjectScoreInNum = iInNumber
End Function
...全文
106 点赞 收藏 6
写回复
6 条回复
hhhljlishen 2020年08月28日
用反射,怎么可能无解
回复 点赞
无言无忌 2017年04月15日
搜索并阅读了大量的例子,发现原来微软早就给出了解决方案。

Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

在ScottGu的blog中给出了源码及使用例子,在VS2013及之后的版本里可以直接在NuGet中引用System.linq.Dynamic


这样在我们的代码中就可以用了


Imports System.Linq.Dynamic

'省略非必要的代码

Dim strQuery As String
Select Case strSubject
Case "语文"
strQuery = "TestID=" & iTestID.ToString() & " And Chinese2>0"
Case "数学"
strQuery = "TestID=" & iTestID.ToString() & " And Maths2>0"
Case "英语"
strQuery = "TestID=" & iTestID.ToString() & " And English2>0"
Case "物理"
strQuery = "TestID=" & iTestID.ToString() & " And Physics2>0"
Case "化学"
strQuery = "TestID=" & iTestID.ToString() & " And Chemistry2>0"
Case "生物"
strQuery = "TestID=" & iTestID.ToString() & " And Biology2>0"
Case "政治"
strQuery = "TestID=" & iTestID.ToString() & " And Politics2>0"
Case "历史"
strQuery = "TestID=" & iTestID.ToString() & " And History2>0"
Case Else
strQuery = "TestID=" & iTestID.ToString() & " And Geography2>0"
End Select
Dim iNum = hmzx.Grade3TestScore.Where(strQuery).Count()




这样看上去没有那么的冗余,不过,直观性就不如原先的代码了,见仁见智吧。
回复 点赞
by_封爱 2017年04月13日
我觉得无解.. 不管你弄什么东西 就算你提出来方法..也是要判断的...
回复 点赞
正怒月神 2017年04月13日
没法简化,看你的model,应该是语数英物理等等作为列的表。 从数据库的角度来说,我觉得如果设计成关联表。你的这个还能简化。
回复 点赞
stherix 2017年04月13日
你用了这么多case 而里面唯一的区别只是科目分数字段不同 就应该想到要找一个 把字符串"数学"这样的映射到ts.Maths2的方法吧 不然是没法简化的
回复 点赞
usertest1 2017年04月13日
我觉得无解。。。。。。。。
回复 点赞
发动态
发帖子
VB
创建于2007-09-28

1.1w+

社区成员

11.0w+

社区内容

VB技术相关讨论,主要为经典vb,即VB6.0
社区公告
暂无公告