缩短条款

时间:2014-03-02 20:38:14

标签: c# linq

我有多个表一对一地与成员表结合,我要提取的两列是成员表中的名称和测试表中的测试。 测试列是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;

1 个答案:

答案 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)};