Skip to content

Commit d7a1e8d

Browse files
committed
CSHARP-917: added support for linq queries through a dictionary.
1 parent 1893e13 commit d7a1e8d

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

src/MongoDB.Bson/Serialization/Serializers/DictionarySerializerBase.cs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ namespace MongoDB.Bson.Serialization.Serializers
2424
/// Represents a serializer for dictionaries.
2525
/// </summary>
2626
/// <typeparam name="TDictionary">The type of the dictionary.</typeparam>
27-
public abstract class DictionarySerializerBase<TDictionary> : ClassSerializerBase<TDictionary>, IBsonDictionarySerializer where TDictionary : class, IDictionary
27+
public abstract class DictionarySerializerBase<TDictionary> :
28+
ClassSerializerBase<TDictionary>,
29+
IBsonDocumentSerializer,
30+
IBsonDictionarySerializer
31+
where TDictionary : class, IDictionary
2832
{
2933
// private constants
3034
private static class Flags
@@ -110,7 +114,24 @@ public IBsonSerializer ValueSerializer
110114
get { return _valueSerializer; }
111115
}
112116

113-
// public methods
117+
// public methods
118+
/// <inheritdoc/>
119+
public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
120+
{
121+
if (_dictionaryRepresentation != DictionaryRepresentation.Document)
122+
{
123+
serializationInfo = null;
124+
return false;
125+
}
126+
127+
serializationInfo = new BsonSerializationInfo(
128+
memberName,
129+
_valueSerializer,
130+
_valueSerializer.ValueType);
131+
return true;
132+
}
133+
134+
// protected methods
114135
/// <summary>
115136
/// Deserializes a value.
116137
/// </summary>
@@ -314,7 +335,11 @@ private string SerializeKeyString(object key)
314335
/// <typeparam name="TDictionary">The type of the dictionary.</typeparam>
315336
/// <typeparam name="TKey">The type of the keys.</typeparam>
316337
/// <typeparam name="TValue">The type of the values.</typeparam>
317-
public abstract class DictionarySerializerBase<TDictionary, TKey, TValue> : ClassSerializerBase<TDictionary>, IBsonDictionarySerializer where TDictionary : class, IDictionary<TKey, TValue>
338+
public abstract class DictionarySerializerBase<TDictionary, TKey, TValue> :
339+
ClassSerializerBase<TDictionary>,
340+
IBsonDocumentSerializer,
341+
IBsonDictionarySerializer
342+
where TDictionary : class, IDictionary<TKey, TValue>
318343
{
319344
// private constants
320345
private static class Flags
@@ -401,6 +426,23 @@ public IBsonSerializer<TValue> ValueSerializer
401426
}
402427

403428
// public methods
429+
/// <inheritdoc/>
430+
public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
431+
{
432+
if (_dictionaryRepresentation != DictionaryRepresentation.Document)
433+
{
434+
serializationInfo = null;
435+
return false;
436+
}
437+
438+
serializationInfo = new BsonSerializationInfo(
439+
memberName,
440+
_valueSerializer,
441+
_valueSerializer.ValueType);
442+
return true;
443+
}
444+
445+
// protected methods
404446
/// <summary>
405447
/// Deserializes a value.
406448
/// </summary>

src/MongoDB.Driver.Tests/Linq/IntegrationTestBase.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ private void InsertFirst()
8181
O = new List<long> { 10, 20, 30 },
8282
Q = Q.One,
8383
R = new DateTime(2013, 1, 2, 3, 4, 5, 6, DateTimeKind.Utc),
84+
T = new Dictionary<string, int> { { "one", 1 }, { "two", 2 } }
8485
};
8586
_collection.InsertOneAsync(root).GetAwaiter().GetResult();
8687
}
@@ -175,6 +176,8 @@ public class Root : IRoot
175176
public Q Q { get; set; }
176177

177178
public DateTime? R { get; set; }
179+
180+
public Dictionary<string, int> T { get; set; }
178181
}
179182

180183
public class RootDescended : Root

src/MongoDB.Driver.Tests/Linq/Translators/PredicateTranslatorTests.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,15 @@ public void CompareTo_not_equal()
336336
"{'A': { $ne: 'Amazing' } }");
337337
}
338338

339+
[Test]
340+
public void DictionaryIndexer()
341+
{
342+
Assert(
343+
x => x.T["one"] == 1,
344+
1,
345+
"{'T.one': 1}");
346+
}
347+
339348
[Test]
340349
public void EnumerableCount()
341350
{

0 commit comments

Comments
 (0)