Skip to content

Commit aa02882

Browse files
VikingsFanxuzhg
authored andcommitted
WebAPI V4 EntityReferences Link does not support $count query option.
#205
1 parent c3b15dc commit aa02882

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

OData/src/System.Web.OData/OData/Formatter/Serialization/ODataEntityReferenceLinksSerializer.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq;
55
using System.Runtime.Serialization;
66
using System.Web.Http;
7+
using System.Web.OData.Extensions;
78
using System.Web.OData.Properties;
89
using System.Web.OData.Routing;
910
using Microsoft.OData.Core;
@@ -52,6 +53,11 @@ public override void WriteObject(object graph, Type type, ODataMessageWriter mes
5253
{
5354
Links = uris.Select(uri => new ODataEntityReferenceLink { Url = uri })
5455
};
56+
57+
if (writeContext.Request != null)
58+
{
59+
entityReferenceLinks.Count = writeContext.Request.ODataProperties().TotalCount;
60+
}
5561
}
5662

5763
messageWriter.WriteEntityReferenceLinks(entityReferenceLinks);

OData/test/System.Web.OData.Test/OData/Formatter/Serialization/ODataEntityReferenceLinksSerializerTest.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
22

33
using System.IO;
4+
using System.Linq;
5+
using System.Net.Http;
46
using System.Runtime.Serialization;
7+
using System.Web.OData.Extensions;
8+
using System.Xml.Linq;
59
using Microsoft.OData.Core;
610
using Microsoft.TestCommon;
711

@@ -98,5 +102,49 @@ public void ODataEntityReferenceLinkSerializer_Serializes_UrisAndEntityReference
98102
"\"value\":[{\"@odata.id\":\"http://uri1/\"},{\"@odata.id\":\"http://uri2/\"}]}",
99103
result);
100104
}
105+
106+
public static TheoryDataSet<object> SerializationTestData2
107+
{
108+
get
109+
{
110+
Uri uri1 = new Uri("http://uri1");
111+
return new TheoryDataSet<object>
112+
{
113+
new Uri[] {uri1}
114+
};
115+
}
116+
}
117+
118+
[Theory]
119+
[PropertyData("SerializationTestData2")]
120+
public void ODataEntityReferenceLinkSerializer_Serializes_UrisAndEntityReferenceLinks_WithCount(object uris)
121+
{
122+
// Arrange
123+
ODataEntityReferenceLinksSerializer serializer = new ODataEntityReferenceLinksSerializer();
124+
ODataSerializerContext writeContext = new ODataSerializerContext();
125+
writeContext.Request = new HttpRequestMessage();
126+
writeContext.Request.ODataProperties().TotalCount = 1;
127+
128+
MemoryStream stream = new MemoryStream();
129+
IODataResponseMessage message = new ODataMessageWrapper(stream);
130+
131+
ODataMessageWriterSettings settings = new ODataMessageWriterSettings
132+
{
133+
ODataUri = new ODataUri { ServiceRoot = new Uri("http://any/") }
134+
};
135+
136+
settings.SetContentType(ODataFormat.Json);
137+
ODataMessageWriter writer = new ODataMessageWriter(message, settings);
138+
139+
// Act
140+
serializer.WriteObject(uris, typeof(ODataEntityReferenceLinks), writer, writeContext);
141+
stream.Seek(0, SeekOrigin.Begin);
142+
string result = new StreamReader(stream).ReadToEnd();
143+
Assert.Equal(
144+
string.Format("{0},{1},{2}",
145+
"{\"@odata.context\":\"http://any/$metadata#Collection($ref)\"",
146+
"\"@odata.count\":1",
147+
"\"value\":[{\"@odata.id\":\"http://uri1/\"}]}"), result);
148+
}
101149
}
102150
}

0 commit comments

Comments
 (0)