|
<SfQueryBuilder @ref="qbObj" Width="70%" TValue="Product" DataSource="@DataSource">
</SfQueryBuilder>
<SfButton Content="Search" @onclick="Search"></SfButton>
@code {
SfQueryBuilder<Product> qbObj;
private List<Product> DataSource = new List<Product>();
private List<Product> GridDataSource = new List<Product>();
protected override async Task OnInitializedAsync()
{
GridDataSource = DataSource = await ProductService.GetProductsAsync();
}
private async Task Search()
{
RuleModel rule = this.qbObj.GetValidRules();
List<Product> filteredList = new List<Product>();
string mongoQuery = await JsRuntime.InvokeAsync<string>("getMongoQuery", rule);
BsonDocument doc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(mongoQuery);
MongoDB.Driver.QueryDocument queryDoc = new QueryDocument(doc);
filteredList = await ProductService.GetSearchProductsAsync(queryDoc);
GridDataSource = filteredList;
}
}
|
|
<script>
var mongoQuery = '{';
function getMongoQuery(rule) {
mongoQuery = '{';
mongoQuery = qbRules(rule);
return mongoQuery;
}
function qbRules(rules) {
mongoQuery = '{';
if (rules.condition == "or") {
mongoQuery += '"$or":[';
mongoQuery = convertToMongoQuery(rules.rules) + ']';
} else {
mongoQuery += '"$and":[';
mongoQuery = convertToMongoQuery(rules.rules) + ']';
}
mongoQuery += '}';
return mongoQuery;
}
function convertToMongoQuery(rules) {
let i = 0;
var fieldDataQuery = ':{"$regex":';
var fieldDataQueryNotEqual = ':{"$ne":';
var fieldDateQuery = ':{"$date":';
var fieldDateQueryNotEqual = ':{"$ne":{"$date":';
var fieldDataQueryEnd = "}";
var fieldDateQueryEnd = "}}";
rules.forEach((item) => {
i++;
mongoQuery += '{';
if (item.rules != undefined) {
if (item.condition == "or") {
mongoQuery += ' "$or":[';
mongoQuery = this.convertToMongoQuery(item.rules) + ']';
} else {
mongoQuery += ' "$and":[';
mongoQuery = this.convertToMongoQuery(item.rules) + ']';
}
}
var itVal = item.type == 'String' && item.operator != 'in' && item.operator != 'notin' && item.value != null && item.value.trim() != '' ? item.value.replace(/\"/g, "\\\"") : '';
if (item.type == 'String' && (item.operator == 'in' || item.operator == 'notin') && item.value != null && item.value.length == 1) {
itVal = item.value[0].replace(/\"/g, "\\\"");
}
switch (item.operator) {
case "contains":
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDataQuery}".*${itVal}"${fieldDataQueryEnd}`;
break;
case "startswith":
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDataQuery}"^${itVal}"${fieldDataQueryEnd}`;
break;
case "endswith":
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDataQuery}"${itVal}$"${fieldDataQueryEnd}`;
break;
case "equal":
if (item.type == "String") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":"${itVal}"`;
}
else if (item.type == "Number") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":${item.value}`;
} else if (item.type == "Date") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDateQuery}"${item.value}"}`;
} else {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":${item.value.toLowerCase()}`;
}
break;
case "notequal":
if (item.type == "String") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDataQueryNotEqual}"${itVal}"${fieldDataQueryEnd}`;
}
else if (item.type == "Number") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDataQueryNotEqual}${item.value}${fieldDataQueryEnd}`;
} else if (item.type == "Date") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDateQueryNotEqual}"${item.value}"${fieldDateQueryEnd}`;
} else {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}"${fieldDataQueryNotEqual}${item.value.toLowerCase()}${fieldDataQueryEnd}`;
}
break;
case "in":
if (item.type == "String") {
if (item.value.length > 1) {
var s = '';
for (var j = 0, iLen = item.value.length; j < iLen; j++) {
s += '"' + item.value[j] + '"' + ',';
}
s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$in":[${s}]${fieldDataQueryEnd}`;
}
else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$in":['${itVal}']${fieldDataQueryEnd}`;
}
else if (item.type == "Number") {
if (item.value.length > 1) {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$in":[${item.value.toString()}]${fieldDataQueryEnd}`;
}
else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$in":[${item.value}]${fieldDataQueryEnd}`;
}
break;
case "notin":
if (item.type == "String") {
if (item.value.length > 1) {
var s = '';
for (var j = 0, iLen = item.value.length; j < iLen; j++) {
s += '"' + item.value[j] + '"' + ',';
}
s = s.endsWith(',') ? s.substring(0, s.length - 1) : s;
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$nin":[${s}]${fieldDataQueryEnd}`;
}
else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$nin":["${itVal}]"${fieldDataQueryEnd}`;
}
else if (item.type == "Number") {
if (item.value.length > 1) {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$nin":[${item.value.toString()}]${fieldDataQueryEnd}`;
}
else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$nin":[${item.value}]${fieldDataQueryEnd}`;
}
break;
case "greaterthan":
if (item.type == "Date") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$gt":{"$date": "${item.value}"${fieldDateQueryEnd}`;
} else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$gt":${item.value}${fieldDataQueryEnd}`;
break;
case "greaterthanorequal":
if (item.type == "Date") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$gte":{"$date": "${item.value}"${fieldDateQueryEnd}`;
} else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$gte":${item.value}${fieldDataQueryEnd}`;
break;
case "lessthan":
if (item.type == "Date") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$lt":{"$date": "${item.value}"${fieldDateQueryEnd}`;
} else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$lt":${item.value}${fieldDataQueryEnd}`;
break;
case "lessthanorequal":
if (item.type == "Date") {
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$lte":{"$date": "${item.value}"${fieldDateQueryEnd}`;
} else
mongoQuery = `${mongoQuery}"${item.field.substring(0)}":{"$lte":${item.value}${fieldDataQueryEnd}`;
break;
}
mongoQuery += '}';
if (rules.length != i) {
mongoQuery += ',';
}
});
return mongoQuery;
}
</script> |
|
public class ProductService
{
MainDbContext _dbContext = new MainDbContext();
public async Task<List<Product>> GetProductsAsync()
{
try
{
return await _dbContext.ProductCollection.Find(_ => true).ToListAsync().ConfigureAwait(false);
}
catch
{
throw;
}
}
public async Task<List<Product>> GetSearchProductsAsync(QueryDocument query)
{
try
{
return await _dbContext.ProductCollection.Find(query).ToListAsync().ConfigureAwait(false);
}
catch
{
throw;
}
}
}
public MainDbContext()
{
var client = new MongoClient("mongodb://localhost:27017");
_mongoDatabase = client.GetDatabase("TestDB");
} |