none
請問有關LINQ to Entity如何使用Where命令 RRS feed

  • 問題

  • 大家好,
           請問LINQ to Entity中如何使用WHERE命令篩選以字串為格式的日期區間,例如我想找出資料庫中今天仍然有效的員工資料,以T-SQL為例:
    SELECT *
    
    FROM Employee
    
    WHERE @Today BETWEEN StartDate AND DueDate
    
    
          我使用LINQ的寫法時,VS 2008都會告訴我,無法將運算子>=套用至型別string和string的運算元,請問是我寫法錯了或是有什麼地方沒注意到呢?謝謝!
    var EmployeeData = from p in Employee
    
                       join q in Symbol
    
                       on p.Status equals q.SymbolId
    
                       where q.SymbolType == "Status"
    
                       && (p.Iid.Contains(strIid) || p.Name.Contains(strName) || p.Status == strStaus)
    
                       && (strToday >= p.StartDate && strToday <= p.DueDate)
    
                       select new { p.Iid, p.Name, p.StartDate, p.DueDate, p.UpdateDate, Status = q.SymbolName };
    
    
    2009年4月23日 上午 03:22

解答

  • SQL 中使用比較鬆散的型別,所以可以直接使用字串去套,但在 C# 的 LINQ,任何資料都必須要是強型別的,所以你不可以直接拿字串和 DateTime 比較 ...
    你的字串必須要先轉換成 DateTime 型別。

    如果你兩方都是字串,那最好也是先轉成 DateTime 再比較。
     
    小人物一枚。
    • 已標示為解答 TerryChuang 2009年4月23日 上午 05:57
    2009年4月23日 上午 04:00
    版主
  • strToday.CompareTo( p.StartDate)>=0
    • 已標示為解答 TerryChuang 2009年4月23日 上午 07:09
    2009年4月23日 上午 05:26
  • String並沒有將<= 跟 >=這類運算子重載
    他用的是成員函式
    ComparTo
    StartIndex
    EndIndex
    Contains


    • 已標示為解答 TerryChuang 2009年4月23日 上午 05:56
    2009年4月23日 上午 05:42

所有回覆

  • SQL 中使用比較鬆散的型別,所以可以直接使用字串去套,但在 C# 的 LINQ,任何資料都必須要是強型別的,所以你不可以直接拿字串和 DateTime 比較 ...
    你的字串必須要先轉換成 DateTime 型別。

    如果你兩方都是字串,那最好也是先轉成 DateTime 再比較。
     
    小人物一枚。
    • 已標示為解答 TerryChuang 2009年4月23日 上午 05:57
    2009年4月23日 上午 04:00
    版主
  • 謝謝小朱的回答,我找到有關查詢作業中的型別關連性一文,其中提到:
    在資料來源、查詢本身和查詢執行中,LINQ 查詢作業都為強型別 (Strongly Typed)。
    查詢中變數的型別,必須與資料來源中項目的型別以及 foreach 陳述式 (Statement) 中反覆運算變數的型別相容。
    但我疑惑的是在我的EDM中Employee.StartDate和DueDate都是string型態,為何無法與一樣是string型態
    的strToday變數比較呢?
    • 已標示為解答 TerryChuang 2009年4月23日 上午 05:56
    • 已取消標示為解答 TerryChuang 2009年4月23日 上午 05:57
    2009年4月23日 上午 04:54
  • strToday.CompareTo( p.StartDate)>=0
    • 已標示為解答 TerryChuang 2009年4月23日 上午 07:09
    2009年4月23日 上午 05:26
  • String並沒有將<= 跟 >=這類運算子重載
    他用的是成員函式
    ComparTo
    StartIndex
    EndIndex
    Contains


    • 已標示為解答 TerryChuang 2009年4月23日 上午 05:56
    2009年4月23日 上午 05:42
  • 原來是我的用法錯了,謝謝各位的解答,我想我必須改變我的做法,不能把SQL的寫法直接轉成LINQ。
    2009年4月23日 上午 05:54