我有多个表一对一地与成员表结合,我要提取的两列是成员表中的名称和测试表中的测试。 测试列是nvarchar()并且可能有“P”,“F”,null,“”,部分得分如(26.5)或十进制数低于100.以下代码几乎完成了工作但是它看起来很笨拙有很多where子句。 此外,输出按降序排序,但在单个数字后列出双位数,例如: 9.0,9.0,9.0,91.4,8.9,8.8,8.8,86.3,7.9 ......等似乎下降了第一位数字。
var tests = from t in dc1.testLevels
join m in dc1.Members
on t.testCode equals m.memCode
where !t.Final.Equals("P") && // previous year pass
!t.Final.Equals("F")&& // previous year fail
!t.Final.Equals(null)&& // null values
!t.Final.Equals("") && // empty value
!t.Final.Contains("(") // partial value ie..(26)
select new {Member = m.MemName, Current = Convert.ToDecimal(t.Final)};
var outTest = from tr in tests
orderby tr.Current descending
select new { Member = tr.Member, Current = trCurrent};
dgv1.DataSource = outTest;
答案 0 :(得分:0)
看起来你只想获得十进制数的结果。我没有将它列入黑名单以删除你不想要的内容,而是将其列入白名单。
我认为将它转换为流体符号会更容易,这样你就可以创建一个只查找十进制数的Where
子句:
var tests = dc1.testLevels
.Where (t => {decimal dec; return decimal.TryParse(t.Final, out dec);})
.Join(dc1.Members, t => t.testCode, m => m.memCode,
(t,m) => new { Member = m.memCode, Current = Convert.ToDecimal(t.Final) })
.OrderByDescending (x => x.Current);
另请注意,这允许您将OrderBy
子句放在最后,这将以数字方式排序您的结果,而不是像以前那样按字母顺序排序。
修改强>
经过深思熟虑之后,我用查询符号表达了这一点,就像你拥有它一样。另请注意orderby
子句如何更改:
decimal deci;
var tests = from t in dc1.testLevels
let IsDecimal = decimal.TryParse(t.Final, out deci)
where IsDecimal == true
join m in dc1.Members
on t.testCode equals m.memCode
orderby Convert.ToDecimal(t.Final) descending
select new {Member = m.MemName, Current = Convert.ToDecimal(t.Final)};
修改强>
由于这些解决方案在Linq-To-SQL中不起作用,因此您只能使用自己可以执行的操作。您的问题的评论者给出的解决方案是:
var ignoreList = new List<string>
{
"P",
"F",
null,
""
};
var tests = from t in dc1.testLevels
join m in dc1.Members
on t.testCode equals m.memCode
where !ignoreList.Contains(t.Final)
where !t.Final.Contains("(") // partial value ie..(26)
orderby Convert.ToDecimal(t.Final) descending
select new {Member = m.MemName, Current = Convert.ToDecimal(t.Final)};