在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)
at System.Data.Services.ResponseBodyWriter.Write(Stream stream)</stacktrace>
</innererror>
</error>
如果我像这样用手重写查询,这个问题就消失了:http://localhost/DataService.svc/PHOTOS()?$filter=RECORDID eq '123456'
。如何编写LINQ代码,以便强制它在括号中使用$ filter而不是PK?这个表的所有结果都是必需的,所以抓住第一个结果是行不通的。
答案 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以强制它没有主键。