2015-09-17 2 views
3

У меня есть сборка FilterDefinition, которая будет искать адрес на основе свойств, которые не являются пустыми.C# Mongo Query efficiency

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 этот запрос кажется грязным, есть ли лучший способ построить этот тип запроса или это правильный способ?

ответ

3

Несколько дней назад у меня была аналогичная ситуация. Я написал простой метод, который принимает имя поля и значение поля в виде строки.

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

     } 
    } 

Я затем использовать этот фрагмент кода для принятия решения на основе FilterCount:

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

      Result = collection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult(); 
      return true; 
     }