有没有办法可以将包含LINQ where子句的字符串添加到列表中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法可以将包含LINQ where子句的字符串添加到列表中?相关的知识,希望对你有一定的参考价值。

我有这个代码:

         switch (Settings.cvm)
         {
            case CVM.IncludeHidden:
                return new SelectedPhrases()
                {
                    ps = ps,
                    psNoa = psNoa
                };
            case CVM.ExcludeHidden:
                return new SelectedPhrases()
                {
                    ps = ps.Where(x => x.Hidden == false).ToList(),
                    psNoa = psNoa.Where(x => x.Hidden == false).ToList()
                };
            case CVM.Hidden:
                return new SelectedPhrases()
                {
                    ps = ps.Where(x => x.Hidden == true).ToList(),
                    psNoa = psNoa.Where(x => x.Hidden == true).ToList()
                };
            case CVM.Favorites:
                return new SelectedPhrases()
                {
                    ps = ps.Where(x => x.Favorite == true).ToList(),
                    psNoa = psNoa.Where(x => x.Favorite == true).ToList()
                };
            default:
                return null;

        }

有没有办法,而不是从交换机内部返回,我可以让交换机返回我只是where子句,例如:

x => x.Hidden == false

然后在切换后将where子句添加到变量ps和psNoa中?

答案

您可以使用委托Func作为where子句。然后将委托放在Where()方法中。

void Main()
{
    var persons = new []
    {
        new Person { Id = 1, Name = "Alice", Active = true },
        new Person { Id = 2, Name = "Bob", Active = false },
        new Person { Id = 3, Name = "Charlie", Active = true },
    };

    Func<Person, bool> whereClause;

    var isActive = true; // change the value here
    if (isActive)
        whereClause = x => x.Active == true;
    else
        whereClause = x => x.Active == false;

    var query = persons.Where(whereClause);
    query.Dump();   
}

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
}

结果在LinqPad:enter image description here

另一答案

你的确可以

在开关中就行了

case zzz:
    ps = ps.Where(xxxxx).ToList();
    psnoa = psnoa.Where(yyyy).ToList();
    break;
....

然后切换。

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

关键是你可以随意构建一个LINQ操作管道。注意 - 最好将所有内容保留为IEnuemrable而不是List。这会将评估推迟到最后

以上是关于有没有办法可以将包含LINQ where子句的字符串添加到列表中?的主要内容,如果未能解决你的问题,请参考以下文章

Linq to entity 没有生成 where 子句

自动将一些 Where 子句添加到 Linq 表达式树

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

C# LINQ 与两个不同数据集上的条件 where 子句连接

LINQ to SQL Where 子句可选条件

使用 Linq 的 Where 子句中的子字符串