如何在foreach循环中创建动态的Multiple和linq条件

时间:2018-08-17 05:51:18

标签: c# linq

            var users = db.Product.AsEnumerable();
        if (!string.IsNullOrWhiteSpace(filterValue))
        {
            users = users.Where(x => 

              x.CreationTime.ToString("MM/dd/yyyy")
              .Contains(filterValue.ToLower()));                 

        }
        var result = users.ToList();

上面的行需要很长时间才能执行,ids包含列表,查询包含linq查询。基本上我需要形成多个“ AND”条件

///该查询需要花费大量时间来执行,并且多个条件无法正常工作

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您的问题是此查询的运行时间很长。让我们在最后一行中查看代码:

var count = query.Where(predicate).Distinct().ToList().Count();

在LINQ to SQL(和实体)中,如果使用ToList()ToArray()等,则不会执行查询。例如,请考虑以下查询:

var strings = Db.Table
    .Where((string s) => s.Contains("A")) // Will convert to something like WHERE s LIKE '%A%'
    .Select(s => s.ToUpper()) // Will convert to something like SELECT upper(s)
    .ToList(); // Here the query sends to the DB and executes

最终查询为SELECT upper(s) FROM [Table] WHERE s LIKE '%A%'

在这种情况下,首先将查询发送到数据库,并获取与条件(.Where())相对应的所有对象,然后然后获取它们的在您的应用内计数

相反,如果仅从数据库中获取计数,则查询会更快:

var count = query.Where(predicate).Distinct().Count(); // No .ToList()! Here, .Count() executes the query.

答案 1 :(得分:0)

删除ToList以提高性能。因为ToList执行查询并将对象列表检索到内存。但是您只需要数。您不需要物体。

var count = query.Where(predicate).Distinct().Count();