1

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

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?需要此表中的所有结果,因此仅获取第一个结果是行不通的。

4

1 回答 1

1

尝试:

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

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

编辑:

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

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

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

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

于 2012-04-24T21:36:44.993 回答