我在一个表中有超过 600,000 条记录和 20 列。

我想使用 LINQ 查询并使用作为“LIKE”的函数;所以为此我使用了 Contains 。它需要时间(或)它会引发超时过期异常。

那么有人可以建议如何解决这个问题吗?我需要比较4列以上。

var majorAgents = new[] { "iPhone", "Android", "iPad" };


List<Person> lstperson =_context.person.where
                      (w=>majorAgents.Any(x=>w.personLastName.contains(x))
                      || majorAgents.Any(x=>w.personFirstName.contains(x))
                      ||w.Address.Any(s=>majorAgents.Contains(s.addressProof)))//Address table referenced as a list
                        .select(s=> new Person{
                             s.personId,
                             s.perosnLastName,
                             s.personFirstName
                    }).ToList();

最佳答案

也许您应该尝试为所有可能的属性只运行一次 majorAgents.Any 查询。为此,您可以尝试连接 firstNamelastNameaddressProof 字段,并检查 majorAgent 字符串是否存在于此连接字符串中的任何位置。

注意 :我有意修改了 Address 相关条件,因为它似乎与手头的任务无关。在原始查询中,它说: w.Address.Any(s=>majorAgents.Contains(s.addressProof) 这意味着“如果有任何 addressProof 则检查 MajorAgents”,而检查是否 addressProof of any Address has any of the majorAgents 会更明智。为此,我使用了 w.Address.SelectMany(a => a.addressProof).ToArray()string.Join,这将为我提供空格分隔的 addressProof 字符串,我可以在其中查找任何主要代理。如果这不是预期的,请根据要求修改地址的那部分。

因此,要尝试的修改后的查询是:

var majorAgents = new[] { "iPhone", "Android", "iPad" };


List<Person> lstperson =_context.person.where
                      (w=>majorAgents.Any(x=>(w.personLastName + " " + w.personFirstName + " " +string.Join(" ",w.Address.SelectMany(a => a.addressProof).ToArray())).contains(x))
                      )
                        .select(s=> new Person{
                             s.personId,
                             s.perosnLastName,
                             s.personFirstName
                    }).ToList();

希望能帮助到你。

10-05 21:22