Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
SieveModel Submodule Test
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nguyenvu
SieveModel Submodule Test
Commits
40ae5b61
Commit
40ae5b61
authored
4 years ago
by
thienvo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
optimize sieve
parent
808939c9
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
133 additions
and
43 deletions
+133
-43
SieveProcessor.cs
Sieve/Services/SieveProcessor.cs
+133
-43
No files found.
Sieve/Services/SieveProcessor.cs
View file @
40ae5b61
...
...
@@ -159,21 +159,139 @@ namespace Sieve.Services
}
}
public
Expression
<
Func
<
TEntity
,
bool
>>
GetFilterExpressionQuery
<
TEntity
>(
TSieveModel
model
,
ref
string
dynamicQuery1
,
public
string
GetExtendFilterString
<
TEntity
>(
TSieveModel
model
,
bool
bCaseSensitive
=
false
)
{
string
fullQueryString
=
""
;
//string dynamicQuery = "";
if
(
model
?.
GetFiltersParsed
()
==
null
)
{
return
null
;
return
" id > 0"
;
}
//Expression outerExpression = null;
//var parameterExpression = Expression.Parameter(typeof(TEntity), "e");
foreach
(
var
filterTerm
in
model
.
GetFiltersParsed
())
{
//Expression innerExpression = null;
foreach
(
var
filterTermName
in
filterTerm
.
Names
)
{
string
searchPart
=
""
;
string
searchProperty
=
""
;
////////-----------------
var
(
fullName
,
property
)
=
GetSieveProperty
<
TEntity
>(
false
,
true
,
filterTermName
);
if
(
property
!=
null
)
{
var
converter
=
TypeDescriptor
.
GetConverter
(
property
.
PropertyType
);
//dynamic propertyValue = parameterExpression;
foreach
(
object
attrib
in
property
.
GetCustomAttributes
(
true
))
{
searchProperty
=
attrib
.
GetType
().
GetProperty
(
"StringValue"
).
GetValue
(
attrib
,
null
).
ToString
();
}
//foreach (var part in fullName.Split('.'))
//{
// propertyValue = Expression.PropertyOrField(propertyValue, part);
//}
if
(
filterTerm
.
Values
==
null
)
continue
;
foreach
(
var
filterTermValue
in
filterTerm
.
Values
)
{
string
dynamicQuery
=
""
;
//////----------------
dynamic
constantVal
=
converter
.
CanConvertFrom
(
typeof
(
string
))
?
converter
.
ConvertFrom
(
filterTermValue
)
:
Convert
.
ChangeType
(
filterTermValue
,
property
.
PropertyType
);
Expression
filterValue
=
GetClosureOverConstant
(
constantVal
,
property
.
PropertyType
);
if
(!
string
.
IsNullOrEmpty
(
searchProperty
))
{
dynamicQuery
=
GetDynamicQueryString
(
filterTerm
,
searchProperty
.
ToString
(),
filterValue
.
ToString
());
if
(
string
.
IsNullOrEmpty
(
fullQueryString
))
{
searchPart
=
"("
+
dynamicQuery
+
")"
;
}
else
{
searchPart
+=
" Or "
+
"("
+
dynamicQuery
+
")"
;
}
}
#
region
advance
//if (filterTerm.OperatorIsCaseInsensitive)
//{
// propertyValue = Expression.Call(propertyValue,
// typeof(string).GetMethods()
// .First(m => m.Name == "ToUpper" && m.GetParameters().Length == 0));
// filterValue = Expression.Call(filterValue,
// typeof(string).GetMethods()
// .First(m => m.Name == "ToUpper" && m.GetParameters().Length == 0));
//}
//var expression = GetExpression(filterTerm, filterValue, propertyValue, bCaseSensitive);
//if (filterTerm.OperatorIsNegated)
//{
// expression = Expression.Not(expression);
//}
//if (innerExpression == null)
//{
// innerExpression = expression;
//}
//else
//{
// innerExpression = Expression.Or(innerExpression, expression);
//}
#
endregion
}
}
if
(!
string
.
IsNullOrEmpty
(
searchPart
))
{
if
(
string
.
IsNullOrEmpty
(
fullQueryString
))
{
fullQueryString
=
"("
+
searchPart
+
")"
;
}
else
{
fullQueryString
+=
" And "
+
"("
+
searchPart
+
")"
;
}
}
}
}
if
(
string
.
IsNullOrEmpty
(
fullQueryString
))
{
fullQueryString
=
" id > 0"
;
}
return
fullQueryString
;
}
public
Expression
<
Func
<
TEntity
,
bool
>>
GetFilterExpressionQuery
<
TEntity
>(
TSieveModel
model
,
bool
bCaseSensitive
=
false
)
{
Expression
outerExpression
=
null
;
var
parameterExpression
=
Expression
.
Parameter
(
typeof
(
TEntity
),
"e"
);
//string dynamicQuery = "";
if
(
model
?.
GetFiltersParsed
()
==
null
)
{
var
property
=
Expression
.
Property
(
parameterExpression
,
"id"
);
ConstantExpression
constant
=
Expression
.
Constant
(
0
,
typeof
(
int
));
var
rst
=
Expression
.
GreaterThan
(
property
,
constant
);
return
Expression
.
Lambda
<
Func
<
TEntity
,
bool
>>(
rst
,
parameterExpression
);
}
foreach
(
var
filterTerm
in
model
.
GetFiltersParsed
())
{
string
dynamicQuery
=
""
;
Expression
innerExpression
=
null
;
foreach
(
var
filterTermName
in
filterTerm
.
Names
)
{
...
...
@@ -183,11 +301,7 @@ namespace Sieve.Services
var
converter
=
TypeDescriptor
.
GetConverter
(
property
.
PropertyType
);
dynamic
propertyValue
=
parameterExpression
;
foreach
(
object
attrib
in
property
.
GetCustomAttributes
(
true
))
{
dynamicQuery
=
attrib
.
GetType
().
GetProperty
(
"StringValue"
).
GetValue
(
attrib
,
null
).
ToString
();
// Console.WriteLine(attrib);
}
foreach
(
var
part
in
fullName
.
Split
(
'.'
))
{
propertyValue
=
Expression
.
PropertyOrField
(
propertyValue
,
part
);
...
...
@@ -204,10 +318,7 @@ namespace Sieve.Services
Expression
filterValue
=
GetClosureOverConstant
(
constantVal
,
property
.
PropertyType
);
if
(!
string
.
IsNullOrEmpty
(
dynamicQuery
))
{
dynamicQuery
=
GetDynamicQueryString
(
filterTerm
,
dynamicQuery
.
ToString
(),
filterValue
.
ToString
());
}
if
(
filterTerm
.
OperatorIsCaseInsensitive
)
{
propertyValue
=
Expression
.
Call
(
propertyValue
,
...
...
@@ -219,8 +330,6 @@ namespace Sieve.Services
.
First
(
m
=>
m
.
Name
==
"ToUpper"
&&
m
.
GetParameters
().
Length
==
0
));
}
var
expression
=
GetExpression
(
filterTerm
,
filterValue
,
propertyValue
,
bCaseSensitive
);
if
(
filterTerm
.
OperatorIsNegated
)
...
...
@@ -236,27 +345,10 @@ namespace Sieve.Services
{
innerExpression
=
Expression
.
Or
(
innerExpression
,
expression
);
}
}
}
}
if
(!
string
.
IsNullOrEmpty
(
dynamicQuery
))
{
if
(
string
.
IsNullOrEmpty
(
dynamicQuery1
))
{
dynamicQuery1
=
"("
+
dynamicQuery
+
")"
;
}
else
{
dynamicQuery1
+=
" or "
+
"("
+
dynamicQuery
+
")"
;
}
}
if
(
outerExpression
==
null
)
{
outerExpression
=
innerExpression
;
...
...
@@ -268,12 +360,16 @@ namespace Sieve.Services
}
outerExpression
=
Expression
.
And
(
outerExpression
,
innerExpression
);
}
if
(
outerExpression
==
null
)
if
(
outerExpression
==
null
)
{
return
null
;
var
property
=
Expression
.
Property
(
parameterExpression
,
"id"
);
ConstantExpression
constant
=
Expression
.
Constant
(
0
,
typeof
(
int
));
var
rst
=
Expression
.
GreaterThan
(
property
,
constant
);
return
Expression
.
Lambda
<
Func
<
TEntity
,
bool
>>(
rst
,
parameterExpression
);
}
return
Expression
.
Lambda
<
Func
<
TEntity
,
bool
>>(
outerExpression
,
parameterExpression
);
}
private
IQueryable
<
TEntity
>
ApplyFiltering
<
TEntity
>(
TSieveModel
model
,
IQueryable
<
TEntity
>
result
,
...
...
@@ -469,7 +565,7 @@ namespace Sieve.Services
return
result
;
}
public
int
ResultCountBeForeApplyPagination
=
0
;
public
void
Caculate
SkipAndTake
(
TSieveModel
model
,
ref
int
skip
,
ref
int
take
)
public
void
Get
SkipAndTake
(
TSieveModel
model
,
ref
int
skip
,
ref
int
take
)
{
var
page
=
model
?.
Page
??
1
;
var
pageSize
=
model
?.
PageSize
??
_options
.
Value
.
DefaultPageSize
;
...
...
@@ -478,16 +574,10 @@ namespace Sieve.Services
take
=
Math
.
Min
(
pageSize
,
maxPageSize
);
}
public
bool
enablePagination
=
true
;
private
IQueryable
<
TEntity
>
ApplyPagination
<
TEntity
>(
TSieveModel
model
,
IQueryable
<
TEntity
>
result
)
{
if
(!
enablePagination
)
{
return
result
;
}
var
page
=
model
?.
Page
??
1
;
var
pageSize
=
model
?.
PageSize
??
_options
.
Value
.
DefaultPageSize
;
var
maxPageSize
=
_options
.
Value
.
MaxPageSize
>
0
?
_options
.
Value
.
MaxPageSize
:
pageSize
;
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment