2010-03-08 100 views
0

我創建了一個SQL服務器壓縮數據庫(MyDatabase.sdf),並用一些數據填充它。然後我跑SQLMetal.exe和產生的LINQ to SQL類(MyDatabase.mdf)Linq到SQL和SQL Server Compact錯誤:「解析查詢時出錯。」

現在我想從表中選擇的所有記錄具有相對簡單的選擇,而我得到的錯誤:

"There was an error parsing the query. [ Token line number = 3,Token line offset = 67,Token in error = MAX]"

這是我的選擇代碼:

public IEnumerable<Item> ListItems() 
{ 
    MyDatabase db_m = new MyDatabase("c:\mydatabase.sdf"); 
    return this.db_m.TestTable.Select(test => new Item() 
     { 
      ID = test.ID, 
      Name = test.Name, 
      RequestData = test.RequestData != null ? test.RequestData.ToString() : null, 
      Url = new System.Uri(test.Uri) 
     }.AsEnumerable(); 
} 

我讀過的LINQ to SQL可以用於SQL結構緊湊,有一些其他的配置我需要做什麼?

+0

您的代碼被剪輯 - 不可能告訴你正在嘗試做什麼。你能用完整的代碼編輯嗎? – 2010-03-08 03:36:01

+0

@Rob Conery - 我在缺失的代碼中添加了內容,但我不認爲它是問題的一部分,因爲我不認爲代碼並不是生成的查詢的一部分。 – Jeremy 2010-03-08 04:06:04

+0

哦,等我看到問題....檢查如果test.Request!= null在查詢中創建一個case語句。我沒有意識到它是如何工作的! – Jeremy 2010-03-08 04:17:09

回答

5

它可能是一個錯誤的NVARCHAR(MAX)?我想我以前在使用sql compact版本時看到過這樣的錯誤,並且我記得它與SQL compact版本不支持NVARCHAR(MAX)數據類型有關。這也可能是你爲什麼在異常中看到「error = MAX」消息的消息?

+0

你是對的! test.RequestData.ToString()會導致將一個convert(nvarchar(MAX),RequestData)插入到SQL中。 – Jeremy 2010-03-08 04:25:53

+0

不錯!很高興這是它:) – Eric 2010-03-08 15:48:20

+0

你會在SQL CE數據庫中替換nvarchar(max)什麼? – Alxandr 2011-08-30 17:53:37

0

爲什麼你需要在RequestData上進行轉換?你的班級是什麼樣的?你能像這樣設定嗎?

RequestData = test.RequestData 
+0

我的類使用字符串來保存請求數據,而數據庫使用圖像。我正在將linq二進制數據轉換爲字符串。不知道我怎樣才能將轉換邏輯移出linq代碼,因爲我不想讓我的類知道任何linq數據類型。我最終將數據庫中的數據類型更改爲ntext而不是圖像。 – Jeremy 2010-03-08 04:36:12

0

我也嘗試使用SQLMetal在WinForms應用程序的LINQ到SQL 一個SQL Server精簡版的方法。 經過一些問題,我跳過了Linq-to-SQL方法,並採用了Linq-To-Entities方法。語法與99%的查詢是一樣的,我正在這麼做;-)

此外,當使用edmx設計器時,可以輕鬆更新,刪除和添加表格(使用拖放或右鍵單擊相當於設計師。)