Почему запрос LINQ в выражении выдает эту ошибку? - PullRequest
0 голосов
/ 17 сентября 2018

Предпосылка: Я новичок в c # и StackOverflow.

У меня есть список, в котором пользователь может искать, имеет фильтры и сортировку.

Я запрашиваю исходную коллекцию и передаю ее в коллекцию, связанную с представлением.

Пока пользователь ищет (асинхронно), я запрашиваю и полностью заменяю коллекцию.Когда пользователь фильтрует / сортирует запрос, сравнивает и добавляет / удаляет его из отображаемой коллекции.

Вопрос:

Можно ли сделать эти запросы менее подробными, используядругая техника?Этот фрагмент кода содержит код только для одного случая фильтра ... Он очень быстро и очень быстро повторяет части запросов.

У меня недостаточно опыта, чтобы понять, является ли следующий код наиболее эффективным подходом, но это работает.

...
else if ( Filter == "show all" )
{
    if ( Sort == "Quantity" )
    {
        if (SearchTxt.Length > 1) // searchbox is not empty
        {
            if (SearchTxt== _oldSearchTxt )
            {
                // User has typed in search, perform normal query
                // by filter, sort and searchtxt
            }
            else
            {
                // User is typing in search, perform async query
                // by filter, sort and searchtxt 
            }
        }
        else // searchbox is empty
        {
                // perform normal query
                // by filter, sort
        }
    }
    else if ( Sort == "Rating" )
    {
        if (SearchTxt.Length > 1) // searchbox is not empty
        {
            if (SearchTxt== _oldSearchTxt )
            {
                // User has typed in search, perform normal query
                // by filter, sort and searchtxt
            }
            else
            {
                // User is typing in search, perform async query
                // by filter, sort and searchtxt 
            }
        }
        else // searchbox is empty
        {
                // perform normal query
                // by filter, sort
        }
    }
    else // Sort == "Name"
    {
        if (SearchTxt.Length > 1) // searchbox is not empty
        {
            if (SearchTxt== _oldSearchTxt )
            {
                // User has typed in search, perform normal query
                // by filter, sort and searchtxt
            }
            else
            {
                // User is typing in search, perform async query
                // by filter, sort and searchtxt 
            }
        }
        else // searchbox is empty
        {
                // perform normal query
                // by filter, sort
        }
    }
}
_oldSearchTxt = SearchTxt;

Я пытался поместить части запросов в выражение, но выдает ошибку:

Expression<Func<MyClassObject, bool>> ItIsFlagged = x => x.IsFlagged.Equals(true);
// the query 
InventoryVM.ReplaceWith( new GroupedObservableCollection<string, MyClassObject>( s => s.Brand,
    Inventory.Where( ItIsFlagged )
    .Where(x => x.Name.ToUpper().Contains(Searchtxt))
    , Comparer
);

throws

"Error  CS1503  Argument 2: cannot convert from'System.Linq.Expressions.Expression<System.Func<MyApp.Models.MyObjectClass, bool>>' to 'System.Func<MyApp.Models.MyObjectClass, bool>"

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

1 Ответ

0 голосов
/ 17 сентября 2018

Функция Linq Where ожидает Func<T, bool> (T в вашем случае MyClassObject), но вы указали Expression<Func<T,bool>>, измените код так, чтобы он выглядел следующим образом:

Func<MyClassObject, bool> ItIsFlagged = x => x.IsFlagged.Equals(true);

Кроме того, вам не нужно повторять код поиска для всех параметров фильтра, вы можете сделать что-то вроде этого:

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
}

public static void Main()
{
    IEnumerable<Person> people = new List<Person>
    {
        new Person { Name = "John", Age = 51 },
        new Person { Name = "Smith", Age = 22 },
    };

    Console.Write("Sort By (age, name):");
    var sortBy = Console.ReadLine();

    if (sortBy == "age")
        people = people.OrderBy(p => p.Age);
    else if (sortBy == "name")
        people = people.OrderBy(p => p.Name);

    foreach(var person in people)
    {
        Console.WriteLine($"{person.Name} - {person.Age}");
    }
}

Несколько предложений:

  • Попробуйте использовать enum для параметров сортировки или, по крайней мере, использовать константы вместо магических строк.
  • Посмотрите Соглашения об именах .NET , важно использовать согласованное соглашение об именах.
  • MyClassObject - очень плохое имя для класса, пожалуйста,Не используйте его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...