2012-04-24 25 views
1

解決方法,當在一個表中的主鍵,產生的查詢:LINQ實體:雖然在Silverlight應用程序中使用LINQ實體需要查詢在主鍵

var query = (from b in PHOTOS 
where b.RECORDID == selectedRecordId 
select b); 

它看起來像這樣http://localhost/DataService.svc/PHOTOS('123456')。這是沒問題的,直到需要使用與舊數據庫(令人驚訝地)不強制實施PK約束的相同代碼。結果是一個返回的記錄緊隨其後的錯誤:

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <code></code> 
    <message xml:lang="en-US">An error occurred while processing this request.</message> 
    <innererror> 
    <message>A single resource was expected for the result, but multiple resources were found.</message> 
    <type>System.InvalidOperationException</type> 
    <stacktrace> at System.Data.Services.Serializers.Serializer.WriteRequest(IEnumerator queryResults, Boolean hasMoved)&#xD; 
    at System.Data.Services.ResponseBodyWriter.Write(Stream stream)</stacktrace> 
    </innererror> 
</error> 

這個問題消失,如果我重寫用手像這樣的查詢:http://localhost/DataService.svc/PHOTOS()?$filter=RECORDID eq '123456'。我如何編寫LINQ代碼,以便強制它使用$ filter而不是PK中的括號?這個表格中的所有結果都是需要的,所以只抓取第一個結果是行不通的。

回答

1

嘗試:

var query = (from b in PHOTOS 
      where b.RECORDID == selectedRecordId 
      select b).FirstOrDefault; 

這將迫使一個結果(或對象的默認,通常沒什麼,如果沒有具有該ID的記錄)。

編輯:

基於下面的評論,我不能在我面前的那一刻驗證沒有IDE在解決方案

第二次嘗試:

var query = (from b in PHOTOS 
      select b).Where(p => p.RECORDID == selectedRecordId); 

我的理由是在初始查詢之外移動where子句可能會強制它成爲一個過濾器。

如果這不起作用,我唯一的想法就是修改EF架構以覆蓋PHOTOS,強制它沒有主鍵。

+0

Upvote有效的解決方法,但我忽略了我的問題中的2個重要細節;上面編輯。具體而言,這不適用於異步Silverlight調用。 – jordanpg 2012-04-24 21:48:02

+0

編輯了一些其他的想法。 – MCattle 2012-04-25 18:32:29

+0

感謝您的補充想法。追加Where()不能解決問題,這並不令我感到意外,因爲我記得了解這兩種形式在功能上是完全相同的。顯然,修改模式也可以解決這個問題,但這不是一個選項。 – jordanpg 2012-04-25 22:26:34