2014-03-02 96 views
0

我有多個表與一個一對一的成員表相結合,我想要提取的兩列是來自成員表的名稱和來自測試表的測試。 測試列是nvarchar(),並且可能包含「P」,「F」,null,「」,部分分數(例如(26.5))或十進制數以下的條目。下面的代碼幾乎可以完成這項工作,但它看起來很笨重,有很多條款。 此外,輸出按降序排列,但列出了單個數字後的雙位數字,例如: 9.0,9.0,9.0,91.4,8.9,8.8,8.8,86.3,7.9等等,它似乎下降了第一個數字上的數字。縮短where子句

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; 
+2

降序是因爲該值被視爲字符串而不是數字。看看您是否可以在訂購前轉換它。 –

+2

你可以把你正在檢查的字符串放在一個列表中,並執行'list.Contains(t.Final)'或類似的東西。 – Chris

回答

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到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)}; 
+0

如果它是一個LINQ到SQL或類似類型的東西,那麼where子句會工作嗎? – Chris

+1

@Chris,OP有一個'Convert.ToDecimal',它向我表明它至少不是實體框架。如果它是Linq-To-Sql,但我不太確定。我的猜測是TryParse在那裏不起作用。 –

+0

第一個塊發出此錯誤: 帶有語句正文的lambda表達式無法轉換爲表達式樹。 第二塊引發了異常這一原因: 「System.NotSupportedException」類型的未處理的異常發生在System.Data.Linq.dll 其他信息:方法「布爾的TryParse(System.String,System.Decimal的ByRef )'沒有支持到SQL的轉換。 但很好想試試,感謝 – nigs