none
LINQ to Entities 無法辨識方法... RRS feed

  • 問題



  • 各位好

    最近在試LinQ To Entity
    但,在寫LinQ時卻有這樣的錯誤

    LINQ to Entities 無法辨識方法 'System.String ToString(System.String)' 方法,而且這個方法無法轉譯成存放區運算式。

    程式代碼如下:

                NORTHWNDEntities NorthWND = new NORTHWNDEntities();
    
                var EmployeeData = from emp in NorthWND.Employees
                                   select new { EmployeeID = emp.EmployeeID,
                                                //EmployeeName = string.Format("{0} {1}", emp.LastName, emp.FirstName), 
                                                EmployeeName = emp.LastName + " " + emp.FirstName,
                                                BirthDate = DateTime.Parse(emp.BirthDate.ToString()).ToString("yyyy/MM/dd"),
                                                Title = emp.Title };
    
                //this.agvData.DataSource = NorthWND.Employees.ToList();
                //this.agvData.DataSource = EmployeeData;
                //this.agvData.DataSource = NorthWND.Employees.Select(emp => new { emp.EmployeeID, EmployeeName = string.Format("{0} {1}", emp.LastName, emp.FirstName) });
                //this.agvData.DataBind();
                

    問題是出在Linq的語法中,我使用了string.FormatDateTime.Parse所致

    但,這部分在Linq To SQL/DataSet時是正常的

    用LINQPad測試也是正常可執行

    5IOrderedQueryable<> (9 items)
    EmployeeIDEmployeeNameBirthDateTitle

    1

    Davolio Nancy

    1948/12/08

    Sales Representative

    2

    Fuller Andrew

    1952/02/19

    Vice President, Sales

    3

    Leverling Janet

    1963/08/30

    Sales Representative

    4

    Peacock Margaret

    1937/09/19

    Sales Representative

    5

    Buchanan Steven

    1955/03/04

    Sales Manager

    6

    Suyama Michael

    1963/07/02

    Sales Representative

    7

    King Robert

    1960/05/29

    Sales Representative

    8

    Callahan Laura

    1958/01/09

    Inside Sales Coordinator

    9

    Dodsworth Anne

    1966/01/27

    Sales Representative

    是使用方式是錯的嗎?還是有限制?
    查了一下google,但,好像沒有人有這樣的問題 Orz
    想用gridview來顯示,卻有這樣的問題

    麻煩各位幫忙解惑,感謝 ^^



    2010年1月14日 上午 03:37

解答

  • 此外哪些語法可以轉譯正常要看LINQ provider是否有實作,所以LINQ to SQL,LINQ to XML或LINQ to Entities不盡相同.
    • 已標示為解答 imVZA 2010年1月14日 上午 05:43
    2010年1月14日 上午 05:25
  • 這是必然的,試想sql語法本身就不像linq那麼有彈性,既然linq to entities最終對的是資料庫當然還是會受限資料庫.除非哪天linq取代sql成為資料庫的查詢語言不然這個問題一定存在.目前沒有一種產品能克服這個問題.EF已經算是目前ORM中比較好的幾項產品之一.
    • 已標示為解答 imVZA 2010年1月15日 上午 01:34
    2010年1月14日 下午 11:50

所有回覆

  • LINQ to Entities實際對的是關聯式資料庫,所以最終還是產生SQL語法去查詢資料庫,故並非所有.Net function都能正確的轉成SQL語句,只有少部分可以.
    2010年1月14日 上午 04:58
  • 此外哪些語法可以轉譯正常要看LINQ provider是否有實作,所以LINQ to SQL,LINQ to XML或LINQ to Entities不盡相同.
    • 已標示為解答 imVZA 2010年1月14日 上午 05:43
    2010年1月14日 上午 05:25
  • 原來如此

    一直以為 LINQ 是種語法,應該寫法都是一樣

    不會因LINQ TO SQL、LINQ TO Entity…而不同

    而LINQ最後應該還是會轉成SQL的語法,總覺得這樣的限制有點缺乏彈性

    LINQ語法:
    from emp in Employees
    select new { EmployeeID = emp.EmployeeID,
    			EmployeeName = string.Format("{0} {1}", emp.LastName, emp.FirstName), 
    			BirthDate = DateTime.Parse(emp.BirthDate.ToString()).ToString("yyyy/MM/dd"),
    			Title = emp.Title }


    轉成SQL語法:
    SELECT [t0].[EmployeeID], [t0].[LastName] AS [arg0], [t0].[FirstName] AS [arg1], CONVERT(NVarChar(MAX),[t0].[BirthDate]) AS [s], [t0].[Title]
    FROM [Employees] AS [t0]
    





    2010年1月14日 上午 05:55
  • 這是必然的,試想sql語法本身就不像linq那麼有彈性,既然linq to entities最終對的是資料庫當然還是會受限資料庫.除非哪天linq取代sql成為資料庫的查詢語言不然這個問題一定存在.目前沒有一種產品能克服這個問題.EF已經算是目前ORM中比較好的幾項產品之一.
    • 已標示為解答 imVZA 2010年1月15日 上午 01:34
    2010年1月14日 下午 11:50