Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Extensions / UI / WebControls / Expressions / SearchExpression.cs / 1305376 / SearchExpression.cs
#if ORYX_VNEXT
namespace Microsoft.Web.Data.UI.WebControls.Expressions {
#else
namespace System.Web.UI.WebControls.Expressions {
#endif
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
using System.Web.Resources;
using System.Web.UI;
using System.Web.UI.WebControls;
public class SearchExpression : ParameterDataSourceExpression {
public string DataFields {
get {
return (string)ViewState["DataFields"] ?? String.Empty;
}
set {
ViewState["DataFields"] = value;
}
}
public SearchType SearchType {
get {
object o = ViewState["SearchType"];
return o != null ? (SearchType)o : SearchType.StartsWith;
}
set {
ViewState["SearchType"] = value;
}
}
public StringComparison ComparisonType {
get {
object o = ViewState["ComparisonType"];
return o != null ? (StringComparison)o : StringComparison.OrdinalIgnoreCase;
}
set {
ViewState["ComparisonType"] = value;
}
}
public override IQueryable GetQueryable(IQueryable source) {
if (source == null) {
return null;
}
if ((DataFields == null) || String.IsNullOrEmpty(DataFields.Trim())) {
throw new InvalidOperationException(AtlasWeb.Expressions_DataFieldRequired);
}
IDictionary values = GetValues();
if (values.Count == 0) {
throw new InvalidOperationException(AtlasWeb.SearchExpression_ParameterRequired);
}
string query = Convert.ToString(values.First().Value, CultureInfo.CurrentCulture);
if (String.IsNullOrEmpty(query)) {
return null;
}
string[] properties = DataFields.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
// Use the or expression to or the fields together
List searchExpressions = new List();
ParameterExpression parameterExpression = Expression.Parameter(source.ElementType, String.Empty);
foreach (string p in properties) {
Expression property = ExpressionHelper.CreatePropertyExpression(parameterExpression, p.Trim());
searchExpressions.Add(CreateCallExpression(property, query));
}
return ExpressionHelper.Where(source,
Expression.Lambda(ExpressionHelper.Or(searchExpressions),
parameterExpression));
}
private Expression CreateCallExpression(Expression property, string query) {
// LINQ to SQL does not support the overloads StartsWith(string, StringComparer) or EndsWith(string, StringComparer)
// and Contains has not overload that takes a StringComparer
if (SearchType == SearchType.Contains || (ViewState["ComparisonType"] == null)) {
return Expression.Call(property, SearchType.ToString(), Type.EmptyTypes, Expression.Constant(query, property.Type));
}
return Expression.Call(property, SearchType.ToString(), Type.EmptyTypes, Expression.Constant(query, property.Type), Expression.Constant(ComparisonType));
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
#if ORYX_VNEXT
namespace Microsoft.Web.Data.UI.WebControls.Expressions {
#else
namespace System.Web.UI.WebControls.Expressions {
#endif
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
using System.Web.Resources;
using System.Web.UI;
using System.Web.UI.WebControls;
public class SearchExpression : ParameterDataSourceExpression {
public string DataFields {
get {
return (string)ViewState["DataFields"] ?? String.Empty;
}
set {
ViewState["DataFields"] = value;
}
}
public SearchType SearchType {
get {
object o = ViewState["SearchType"];
return o != null ? (SearchType)o : SearchType.StartsWith;
}
set {
ViewState["SearchType"] = value;
}
}
public StringComparison ComparisonType {
get {
object o = ViewState["ComparisonType"];
return o != null ? (StringComparison)o : StringComparison.OrdinalIgnoreCase;
}
set {
ViewState["ComparisonType"] = value;
}
}
public override IQueryable GetQueryable(IQueryable source) {
if (source == null) {
return null;
}
if ((DataFields == null) || String.IsNullOrEmpty(DataFields.Trim())) {
throw new InvalidOperationException(AtlasWeb.Expressions_DataFieldRequired);
}
IDictionary values = GetValues();
if (values.Count == 0) {
throw new InvalidOperationException(AtlasWeb.SearchExpression_ParameterRequired);
}
string query = Convert.ToString(values.First().Value, CultureInfo.CurrentCulture);
if (String.IsNullOrEmpty(query)) {
return null;
}
string[] properties = DataFields.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
// Use the or expression to or the fields together
List searchExpressions = new List();
ParameterExpression parameterExpression = Expression.Parameter(source.ElementType, String.Empty);
foreach (string p in properties) {
Expression property = ExpressionHelper.CreatePropertyExpression(parameterExpression, p.Trim());
searchExpressions.Add(CreateCallExpression(property, query));
}
return ExpressionHelper.Where(source,
Expression.Lambda(ExpressionHelper.Or(searchExpressions),
parameterExpression));
}
private Expression CreateCallExpression(Expression property, string query) {
// LINQ to SQL does not support the overloads StartsWith(string, StringComparer) or EndsWith(string, StringComparer)
// and Contains has not overload that takes a StringComparer
if (SearchType == SearchType.Contains || (ViewState["ComparisonType"] == null)) {
return Expression.Call(property, SearchType.ToString(), Type.EmptyTypes, Expression.Constant(query, property.Type));
}
return Expression.Call(property, SearchType.ToString(), Type.EmptyTypes, Expression.Constant(query, property.Type), Expression.Constant(ComparisonType));
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PartialCachingControl.cs
- CodeArrayCreateExpression.cs
- GlyphRunDrawing.cs
- MD5CryptoServiceProvider.cs
- GeneralTransformGroup.cs
- BlockingCollection.cs
- CssTextWriter.cs
- DataGridItemAttachedStorage.cs
- AuthorizationContext.cs
- SelectedDatesCollection.cs
- ResolveDuplex11AsyncResult.cs
- XmlNavigatorFilter.cs
- GridItemPattern.cs
- BooleanExpr.cs
- DbFunctionCommandTree.cs
- SplashScreenNativeMethods.cs
- IndicShape.cs
- FontUnit.cs
- Emitter.cs
- UserControlAutomationPeer.cs
- StreamWithDictionary.cs
- CodeAccessPermission.cs
- IdentityModelStringsVersion1.cs
- SqlPersonalizationProvider.cs
- PasswordBox.cs
- AbandonedMutexException.cs
- ScrollBar.cs
- XsdBuildProvider.cs
- X509SecurityToken.cs
- PropertyEmitter.cs
- DefaultObjectMappingItemCollection.cs
- DBCommandBuilder.cs
- ADMembershipUser.cs
- SerializationStore.cs
- ListViewHitTestInfo.cs
- RadioButtonStandardAdapter.cs
- WebContentFormatHelper.cs
- EpmSyndicationContentSerializer.cs
- ExtentKey.cs
- Base64Encoding.cs
- GrabHandleGlyph.cs
- ResumeStoryboard.cs
- SmiSettersStream.cs
- AnimationClock.cs
- SimpleBitVector32.cs
- XmlStrings.cs
- NamespaceInfo.cs
- ClassData.cs
- Msmq4SubqueuePoisonHandler.cs
- PointHitTestResult.cs
- GridViewAutomationPeer.cs
- HandleValueEditor.cs
- SmtpNetworkElement.cs
- XmlAttributes.cs
- TrustLevel.cs
- AttributeInfo.cs
- Int32AnimationBase.cs
- QilDataSource.cs
- BaseCollection.cs
- SocketAddress.cs
- TimelineGroup.cs
- ZipIOExtraField.cs
- BackgroundFormatInfo.cs
- mactripleDES.cs
- X509ChainElement.cs
- XPathDocumentIterator.cs
- TraceContextRecord.cs
- XmlMembersMapping.cs
- WebBrowser.cs
- ListBoxChrome.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- _SslSessionsCache.cs
- FreezableCollection.cs
- MethodExpr.cs
- SchemaTableOptionalColumn.cs
- PbrsForward.cs
- ReachSerializationCacheItems.cs
- WhitespaceRuleReader.cs
- WebPartCloseVerb.cs
- MetadataSerializer.cs
- FilterException.cs
- coordinatorscratchpad.cs
- DataGridColumnCollection.cs
- VirtualPath.cs
- AsnEncodedData.cs
- TextServicesCompartmentEventSink.cs
- ComboBoxItem.cs
- LongValidatorAttribute.cs
- ProxyHwnd.cs
- KeyInfo.cs
- Int16Converter.cs
- PassportPrincipal.cs
- CustomErrorCollection.cs
- ParserHooks.cs
- ImageButton.cs
- UInt32Storage.cs
- DataGridClipboardCellContent.cs
- LinqDataSourceView.cs
- DesignBindingEditor.cs
- WorkflowIdleElement.cs