LINQ to Entities:查询主键所需的解决方法

时间:2012-04-24 21:26:33

标签: linq-to-entities wcf-data-services

在Silverlight应用中使用LINQ to Entities时,在表的主键上生成查询时:

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

它看起来像http://localhost/DataService.svc/PHOTOS('123456')。这是可以的,直到需要使用与旧DB相同的代码(令人惊讶地)没有强制执行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 个答案:

答案 0 :(得分:1)

尝试:

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

如果没有带有该ID的记录,这将强制执行单个结果(或对象的默认值,通常为Nothing)。

修改

基于以下评论的第二次尝试解决方案,如果没有IDE在我面前,我无法验证:

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

我的理由是将where子句移到初始查询之外可能会强制它成为过滤器。

如果这不起作用,我唯一的另一个想法就是修改EF模式以覆盖PHOTOS以强制它没有主键。