2013-03-08 3 views
2

Я хочу выполнить критерии поиска по нескольким свойствам, но у меня возникла проблема. Если какое-то свойство пустое или нуль, которое не является частью критериев поиска, пожалуйста, помогите me..here это код ниже:Критерии поиска по нескольким свойствам C#

public List<AccountDto> getSearchedAccount(int accountid,int userid,String holdername,String type,double balance,String status) 
{ 
    List<AccountDto> results = new List<AccountDto>(); 
    for (int i = 0; i < list.Count; i++) 
    { 
     AccountDto dto = (AccountDto)list[i]; 
     if ((dto.Accountid == accountid) && (dto.Userid==userid) && (dto.Holdername.Equals(holdername)) && (dto.Balance == balance) && (dto.Status.Equals(status))) 
     { 
      results.Add(dto); 
     } 

    } 

    return results; 
} 

Скажите, пожалуйста, правильно ли утверждение некоторое поле равно нулю или пуст, не делает введите критерии поиска.

+0

У вас есть стабильное количество «Свойства»? В противном случае это решение в конечном итоге взорвет ваш код. –

+0

Да свойства стабильны –

+0

Вы также можете сделать примитивные аргументы 'accountid',' userid' и 'balance' как [свойства с нулевым значением] (http://msdn.microsoft.com/en-us/library /b3h38hb0.aspx) (например, 'int?' или 'double?'), поэтому вы можете перейти в 'null' вместо двусмысленного значения типа' 0'. – mellamokb

ответ

4

Он бы так:

if (accountid < 0 || dto.Accountid == accountid) 
    && ... 
    && (string.IsNullOrEmpty(holdername) || dto.Holdername.Equals(holdername)) 
    && ...) 
    { 
     results.Add(dto); 
    } 

ввести или для каждого состояния, которое является истинным, если значение не задано или вопросы Comparision. Например, если имя владельца равно null или пустое, то Equals of Holdername не будут оцениваться.

+0

большое спасибо ... –

3

Почему бы вам не создать метод для этого? В этом методе вы можете проверить, является ли свойство null или пустым или чем-либо еще.

private bool CheckAccount(AccountDto dto, int accountid, int userid, String holdername, string type, double balance, String status){ 
bool isTrue = true; 
... 
if(holdername != null){ 
    if(!dto.Holdername.Equals(holdername)) 
      return false; 
} 
... 
return true; //all properties are true 
} 
0

Вы можете построить совокупный фильтр в критериях поиска. Я думаю, что ниже пост имеет то же, что и вы ищете. Try This

0

Я бы, наверное, проверить по умолчанию (типа) и string.IsNullOrEmpty (...)

Так вы могли бы:

public List<AccountDto> getSearchedAccount(int accountid, int userid, string holdername, string type, double balance, string status) 
{ 
    var results = new List<AccountDto>(); 

    for (int i = 0; i < list.Count; i++) 
    { 
     AccountDto dto = (AccountDto)list[i]; 

     if (accountid != default(int) && accountid != dto.Accountid) 
      continue; 
     if (userid != default(int) && userid != dto.Userid) 
      continue; 
     if (!string.IsNullOrEmpty(holdername) && !holdername.Equals(dto.Holdername)) 
      continue; 
     if (!string.IsNullOrEmpty(type) && !type.Equals(dto.Type)) 
      continue; 
     if (balance != default(double) && balance != dto.Balance) 
      continue; 
     if (!string.IsNullOrEmpty(status) && !status.Equals(dto.Status)) 
      continue; 

     results.Add(dto); 
    } 

    return results; 
} 

Или делает использование выражение

public List<AccountDto> getSearchedAccount(int accountid, int userid, string holdername, string type, double balance, string status) 
{ 
    IQueryable<AccountDto> query = list.AsQueryable(); 

    if (accountid != default(int)) 
     query = query.Where(i => i.Accountid.Equals(accountid)); 
    if (userid != default(int)) 
     query = query.Where(i => i.Userid.Equals(userid)); 
    if (!string.IsNullOrEmpty(holdername)) 
     query = query.Where(i => i.Holdername.Equals(holdername)); 
    if (!string.IsNullOrEmpty(holdername)) 
     query = query.Where(i => i.Type.Equals(type)); 
    if (balance != default(double)) 
     query = query.Where(i => i.Balance.Equals(balance)); 
    if (!string.IsNullOrEmpty(holdername)) 
     query = query.Where(i => i.Status.Equals(status)); 

    return query.Select(i => i).ToList<AccountDto>(); 
} 

Пара мыслей

  • Я уверен, что вы хотели использовать десятичные значения для денежных ценностей, а не удваивать.
  • Создание объекта для представления ваших критериев, так что вы не имея изменить сигнатуру метода каждый раз, когда вы решили добавить новое поле

    общественных Список getSearchedAccount (критерии AccountSearchCritera) {...}

0
/*** Answer with the comments in code ***/ 
// don't create a class to represent your criteria 
// Dictionary is enough for use and supported by Linq 
// don't use a lot of `&&` or `if`; one `if` is enough 
// all the rules is in deferred execution, only executes when it really needs 
// evaluated and the order to put where clauses matters, don't make it changed 
// it performs like short-circuit evaluation 

/// <summary> 
/// declared as partial for easily coexists with original code 
/// if not used(e.g already declared) then not paste to file 
/// </summary> 
partial class AccountDto /* known members */ { 
    public int Accountid; 
    public int Userid; 
    public String Holdername; 
    public int Balance; 
    public String Status; 
} 

/// <summary> 
/// declared as partial for easily coexists with original code 
/// if getSearchedAccount is declared with another class name 
/// then just rename the partial class to that name and remove 
/// all `static`(if that class is non-static) 
/// the class initializer, then become constructor; remember to 
/// match the name of class and constructor 
/// </summary> 
partial class AccountDto { 
    /// <summary> 
    /// declare as static for this demo; 
    /// not necessarily be static if it's declared in another 
    /// class where list is declared 
    /// </summary> 
    public static List<AccountDto> getSearchedAccount(
     int accountid, int userid, 
     String holdername, String type, 
     double balance, 
     String status 
     ) { 
     var results=new List<AccountDto>(); 

     // make a copy of IgnoreRules and clear; equivalent to 
     // var matchRules=new Dictionary<String, Func<AccountDto, bool>>(); 
     // IgnoreRules is not changed with these two statement 
     // just prevent to see too many angle braces 
     var matchRules=IgnoreRules.ToDictionary(x => x.Key, x => x.Value); 
     matchRules.Clear(); 

     // the parameters only known in this method thus can only added here 
     matchRules.Add("accountid", x => accountid==x.Accountid); 
     matchRules.Add("userid", x => userid==x.Userid); 
     matchRules.Add("holdername", x => holdername==x.Holdername); 
     matchRules.Add("balance", x => balance==x.Balance); 
     matchRules.Add("status", x => status==x.Status); 

     for(int i=0; i<list.Count; i++) { 
      var dto=(AccountDto)list[i]; 

      if((from ignoreRule in IgnoreRules 
       from matchRule in matchRules 
       where ignoreRule.Key==matchRule.Key 
       where !ignoreRule.Value(dto) 
       select matchRule.Value(dto)).All(x => x)) 
       results.Add(dto); 
     } 

     return results; 
    } 

    /// <summary> 
    /// criteria for `don't test for matching` 
    /// </summary> 
    public static Dictionary<String, Func<AccountDto, bool>> IgnoreRules { 
     get; 
     set; 
    } 

    /// <summary> 
    /// use class initializer to add common IgnoreRules 
    /// </summary> 
    static AccountDto() { 
     IgnoreRules=new Dictionary<String, Func<AccountDto, bool>>(); 
     IgnoreRules.Add("accountid", x => 0==x.Accountid); 
     IgnoreRules.Add("userid", x => 0==x.Userid); 
     IgnoreRules.Add("holdername", x => String.IsNullOrEmpty(x.Holdername)); 
     IgnoreRules.Add("balance", x => 0==x.Balance); 
     IgnoreRules.Add("status", x => String.IsNullOrEmpty(x.Status)); 
    } 

    /// <summary> 
    /// declare as static for this demo; 
    /// not necessarily be static if it's declared in another 
    /// class where getSearchedAccount is declared 
    /// </summary> 
    public static List<AccountDto> list=new List<AccountDto>(); 
}