Как применить фильтр с несколькими вариантами - PullRequest
1 голос
/ 19 марта 2019

У меня есть этот объект, который я пытаюсь применить фильтр с помощью LINQ в C #, и мне просто интересно, как я могу применить это.

public class glAccts
{
   public string fund {get;set;}
   public string location {get;set;}
   public string costCenter {get;set;}
   public string object {get;set;}
}

То, что я хочу сделать - это иметь способ, подобный «следовать»

public async TaskIEnumerable<<glAccts>> applyFilter(IEnumerable<glAccts> filterList)
{
   ... code to fetch a list of all glAccts -- glUserAccess --...
               if (filteredGL.Count() > 0)
        {
            for( int i = 0; i < filteredGL.Count(); i++ )
            {
                if ( !string.IsNullOrEmpty(filteredGL.ElementAt(i).fund)) {
                    var response = glUserAccess.Where(c => c.fund.Contains(filteredGL.ElementAt(i).fund));
                }
                if ( !string.IsNullOrEmpty(filteredGL.ElementAt(i).location)) {
                    var response = glUserAccess.Where(c => c.location.Contains(filteredGL.ElementAt(i).location));
                }
                if ( !string.IsNullOrEmpty(filteredGL.ElementAt(i).costCenter)) {
                    var response = glUserAccess.Where(c => c.costCenter.Contains(filteredGL.ElementAt(i).costCenter));
                }
                if ( !string.IsNullOrEmpty(filteredGL.ElementAt(i).objects)) {
                    var response = glUserAccess.Where(c => c.objects.Contains(filteredGL.ElementAt(i).objects));
                }

            }
        }

}

Примечание: это то, что у меня есть в настоящее время, однако я не уверен, как объединить мой ответ и что, если мой объект пуст. Я также предполагаю, что с LINQ может быть более простой способ.

Я хотел бы создать что-то вроде этого:

SELECT glAccts WHERE (activeGlAccts.fund == filteredList[i].fund AND activeGlAccts.location == filteredList[i].location activeGlAccts.costCenter == filteredList[i].costCenter AND activeGlAccts.object == filteredList[i].object ) OR (activeGlAccts.fund == filteredList[i].fund AND activeGlAccts.location == filteredList[i].location activeGlAccts.costCenter == filteredList[i].costCenter AND activeGlAccts.object == filteredList[i].object )

Примечание: между каждой отфильтрованной опцией будет ИЛИ, и каждый элемент будет сгруппирован по И

1 Ответ

1 голос
/ 19 марта 2019

Попробуйте это:

public async TaskIEnumerable<glAccts> applyFilter(IEnumerable<glAccts> filterList)
{
   //... code to fetch a list of all glAccts -- glUserAccess --...
    var response = glUserAccess.Where(c => 
        filteredGL.Any(x=>
            (string.IsNullOrEmpty(x.fund) || c.fund.Contains(x.fund)) && 
            (string.IsNullOrEmpty(x.location) || c.location.Contains(x.location)) && 
            (string.IsNullOrEmpty(x.costCenter) || c.costCenter.Contains(x.costCenter)) && 
            (string.IsNullOrEmpty(x.objects) || c.objects.Contains(x.objects))
            )
        );
    //... rest of code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...