Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Mongo Query efficiency

Tags:

c#

mongodb

I have a FilterDefinition build that will look for an address based on the properties that are not empty.

public static FilterDefinition<TU> FindPointByAddress<TU>(Address address)
{
    var filterBuilder = Builders<TU>.Filter;
    var filterItems = new List<FilterDefinition<TU>>();

    if (!String.IsNullOrWhiteSpace(address.Street))
    {
        filterItems.Add(filterBuilder.Eq("Address.Street", address.Street));
    }

    if (!String.IsNullOrWhiteSpace(address.City))
    {
        filterItems.Add(filterBuilder.Eq("Address.City", address.City));
    }

    if (!String.IsNullOrWhiteSpace(address.StateProvince))
    {
        filterItems.Add(filterBuilder.Eq("Address.StateProvince", address.StateProvince));
    }

    if (!String.IsNullOrWhiteSpace(address.PostCode))
    {
        filterItems.Add(filterBuilder.Eq("Address.PostCode", address.PostCode));
    }

    return filterBuilder.And(filterItems);
}

IMO this query feels dirty, is there a better way to build this type of query or is this the correct way?

like image 577
Chadit Avatar asked Dec 07 '25 06:12

Chadit


1 Answers

A few days ago I had a similar situation. I wrote a simple method that takes a field name and field value as a string.

public void AddEqualCompareFilter(string fieldName, string fieldValue)
    {
        if (String.IsNullOrEmpty(fieldValue) == false) {
            if (Filter != null) {
                Filter = Filter & Builders<TranslationsDocument>.Filter.Eq(fieldName, fieldValue);
            }
            else {
                FilterCount++;
                Filter = Builders<TranslationsDocument>.Filter.Eq(fieldName, fieldValue);
            }

        }
    }

I am then using this snippet to decide based on FilterCount:

if (FilterCount > 0) {
            Result = collection.Find(Filter).ToListAsync().GetAwaiter().GetResult();
            return true;
        }
        else {

            Result = collection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult();
            return true;
        }
like image 113
Matthias Avatar answered Dec 08 '25 19:12

Matthias



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!