自己写的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
...全文
186 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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的方法吧 不然是没法简化的
太虚野老 2017-04-13
  • 打赏
  • 举报
回复
我觉得无解。。。。。。。。

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧