Как я могу иметь предложение LINQ where, которое ничего не делает? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть этот код, который я использую для выбора предложения Where для приложения.

Для случая CVM.IncludeHidden Мне не нужно ограничивать строки и хочу получить все.Но я не уверен, как это сделать.Если это так, что я должен поставить для предложения where?

var select = " SELECT" +
                         " P.PhraseId, P.PhraseNum, P.English, P.Romaji, P.Kana, P.Kanji, P.Modified, P.WordType, P.Favorite," +
                         " P.Hidden, P.Viewed, P.Points, P.Score," +
                         " FROM Phrase" +
                         " WHERE P.Selected = 1 ";

List<Phrase> ps = db2.Query<Phrase>(select).ToList();
List<Phrase> psNoa = ps.Where(x => x.Points < noa).ToList();

Func<Phrase, bool> whereClause;

switch (Settings.cvm)
{
    case CVM.IncludeHidden:
        // I don't want to do any limiting
        // here I just want all records
        whereClause = ??
        break;
    case CVM.ExcludeHidden:
        whereClause = x => x.Hidden == false;
        break;
    case CVM.Hidden:
        whereClause = x => x.Hidden == true;
        break;
    case CVM.Favorites:
        whereClause = x => x.Favorite == true;
        break;
    default:
        return null;
}

return new SelectedPhrases()
{
    ps = ps.Where(whereClause).ToList(),
    psNoa = psNoa.Where(whereClause).ToList()
};

public class SelectedPhrases
{
    public List<Phrase> ps { get; set; }
    public List<Phrase> psNoa { get; set; }
}

1 Ответ

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

Метод расширения Where просто проверяет, равен ли результат функции true.Если так, это проходит.Так что достаточно просто вернуть true:

whereClause = x => true;

Кажется, вы создаете новый список без причины.Это поражает вашу производительность, если вы выполняете это много.Вы также можете установить whereClause на null и просто проверить его перед возвратом объекта:

if (whereClause != null)
{
    return new SelectedPhrases()
        {
            ps = ps.Where(whereClause).ToList(),
            psNoa = psNoa.Where(whereClause).ToList()
        };
}
else
{
    return new SelectedPhrases()
        {
            ps = ps,
            psNoa = psNoa
        };
}
...