1+ using System . Globalization ;
12using System . Linq . Expressions ;
23using Xunit . Abstractions ;
34
@@ -52,6 +53,131 @@ public void Contains_DateTime()
5253 actual . ForEach ( u => output . WriteLine ( u . LastVisitAt ? . Year . ToString ( ) ?? "null" ) ) ;
5354 }
5455
56+ [ Fact ]
57+ public void ContainsString_AsIs ( )
58+ {
59+ var collection = new string [ ] { "x" , "Aa" } ;
60+ var users = new User [ ]
61+ {
62+ new ( ) { FirstName = "aa" } ,
63+ new ( ) { FirstName = "AA" } ,
64+ new ( ) { FirstName = "Aa" } ,
65+ } ;
66+ var expected = users . Where ( u => collection . Contains ( u . FirstName ) ) ;
67+ var func = CreateContainsStringFunc < User , string > (
68+ nameof ( User . FirstName ) ,
69+ collection ,
70+ StringTransform . None ) ;
71+
72+ var actual = users . Where ( func ) . ToList ( ) ;
73+
74+ Assert . Equal ( expected , actual ) ;
75+
76+ actual . ForEach ( u => output . WriteLine ( u . FirstName ) ) ;
77+ }
78+
79+ [ Fact ]
80+ public void ContainsString_AsLower ( )
81+ {
82+ var collection = new string [ ] { "x" , "aa" } ;
83+ var users = new User [ ]
84+ {
85+ new ( ) { FirstName = "aa" } ,
86+ new ( ) { FirstName = "AA" } ,
87+ new ( ) { FirstName = "Aa" } ,
88+ new ( ) { FirstName = "aA" } ,
89+ new ( ) { FirstName = "xx" } ,
90+ new ( ) { FirstName = "XX" } ,
91+ new ( ) { FirstName = "Xx" } ,
92+ new ( ) { FirstName = "xX" } ,
93+ } ;
94+ var expected = users . Where ( u => collection . Contains ( u . FirstName . ToLower ( ) ) ) ;
95+ var func = CreateContainsStringFunc < User , string > (
96+ nameof ( User . FirstName ) ,
97+ collection ,
98+ StringTransform . Lower ) ;
99+
100+ var actual = users . Where ( func ) . ToList ( ) ;
101+
102+ Assert . Equal ( expected , actual ) ;
103+
104+ actual . ForEach ( u => output . WriteLine ( u . FirstName ) ) ;
105+ }
106+
107+ [ Fact ]
108+ public void ContainsString_AsUpper ( )
109+ {
110+ var collection = new string [ ] { "x" , "AA" } ;
111+ var users = new User [ ]
112+ {
113+ new ( ) { FirstName = "aa" } ,
114+ new ( ) { FirstName = "AA" } ,
115+ new ( ) { FirstName = "Aa" } ,
116+ new ( ) { FirstName = "aA" } ,
117+ new ( ) { FirstName = "xx" } ,
118+ new ( ) { FirstName = "XX" } ,
119+ new ( ) { FirstName = "Xx" } ,
120+ new ( ) { FirstName = "xX" } ,
121+ } ;
122+ var expected = users . Where ( u => collection . Contains ( u . FirstName . ToUpper ( ) ) ) ;
123+ var func = CreateContainsStringFunc < User , string > (
124+ nameof ( User . FirstName ) ,
125+ collection ,
126+ StringTransform . Upper ) ;
127+
128+ var actual = users . Where ( func ) . ToList ( ) ;
129+
130+ Assert . Equal ( expected , actual ) ;
131+
132+ actual . ForEach ( u => output . WriteLine ( u . FirstName ) ) ;
133+ }
134+
135+ [ Theory ]
136+ [ InlineData ( "i" , false , 1 ) ]
137+ [ InlineData ( "i" , true , 0 ) ]
138+ [ InlineData ( "ı" , false , 0 ) ]
139+ [ InlineData ( "ı" , true , 1 ) ]
140+ public void ContainsString_AsLower_Culture (
141+ string collectionItem ,
142+ bool withCi ,
143+ int found )
144+ {
145+ var collection = new string [ ] { collectionItem } ;
146+ var users = new User [ ] { new ( ) { FirstName = "I" } } ;
147+ var func = CreateContainsStringFunc < User , string > (
148+ nameof ( User . FirstName ) ,
149+ collection ,
150+ StringTransform . Lower ,
151+ withCi ? new CultureInfo ( "tr-TR" ) : null ) ;
152+
153+ var actual = users . Count ( func ) ;
154+
155+ Assert . Equal ( found , actual ) ;
156+ }
157+
158+ [ Theory ]
159+ [ InlineData ( "I" , false , 1 ) ]
160+ [ InlineData ( "I" , true , 0 ) ]
161+ [ InlineData ( "İ" , false , 0 ) ]
162+ [ InlineData ( "İ" , true , 1 ) ]
163+ public void ContainsString_AsUpper_Culture (
164+ string collectionItem ,
165+ bool withCi ,
166+ int found )
167+ {
168+ var collection = new string [ ] { collectionItem } ;
169+ var users = new User [ ] { new ( ) { FirstName = "i" } } ;
170+ var func = CreateContainsStringFunc < User , string > (
171+ nameof ( User . FirstName ) ,
172+ collection ,
173+ StringTransform . Upper ,
174+ withCi ? new CultureInfo ( "tr-TR" ) : null ) ;
175+
176+ var actual = users . Count ( func ) ;
177+
178+ Assert . Equal ( found , actual ) ;
179+ }
180+
55181 private static Func < TEntity , bool > CreateContainsFunc < TEntity , TProp > (
56182 string propName ,
57183 IEnumerable < TProp > collection )
@@ -65,4 +191,20 @@ private static Func<TEntity, bool> CreateContainsFunc<TEntity, TProp>(
65191
66192 return func ;
67193 }
194+
195+ private static Func < TEntity , bool > CreateContainsStringFunc < TEntity , TProp > (
196+ string propName ,
197+ IEnumerable < TProp > collection ,
198+ StringTransform stringTransform ,
199+ CultureInfo cultureInfo = null )
200+ {
201+ var par = Expression . Parameter ( typeof ( TEntity ) ) ;
202+ var col = Expression . Constant ( collection ) ;
203+ var element = Expression . Property ( par , propName ) ;
204+ var body = ExpressionOperators . ContainsString ( col , element , stringTransform , cultureInfo ) ;
205+ var lambda = Expression . Lambda < Func < TEntity , bool > > ( body , par ) ;
206+ var func = lambda . Compile ( ) ;
207+
208+ return func ;
209+ }
68210}
0 commit comments