简体   繁体   中英

C# Mongo Query efficiency

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?

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;
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM