LINQ中的任何vs Where子句

LINQ中的任何vs Where子句,linq,linq-to-sql,Linq,Linq To Sql,我一直认为对于exists查询,LINQ到SQL的等价物是使用Any()。但我最近在LINQ中编写了一个查询,它基本上是试图查找单个表中是否存在重复记录 Anycontext.Contacts.Any(c=>((c.FirstName==contact.FirstName&&c.LastName==contact.LastName&&c.AddressLine1==contact.AddressLine1&&c.Zip==contact.Zip)|| (!String.IsNullOrEmpty

我一直认为对于exists查询,LINQ到SQL的等价物是使用Any()。但我最近在LINQ中编写了一个查询,它基本上是试图查找单个表中是否存在重复记录

Any
context.Contacts.Any(c=>((c.FirstName==contact.FirstName&&c.LastName==contact.LastName&&c.AddressLine1==contact.AddressLine1&&c.Zip==contact.Zip)||
(!String.IsNullOrEmpty(contact.Email)和&c.Email==contact.Email)))

匹配条件很容易找到具有相同名字、姓氏和地址1或相同电子邮件的联系人。此查询将在30秒后超时(默认),此表中只有500K行

其中
context.Contacts.Where(c=>((c.FirstName==contact.FirstName&&c.LastName==contact.LastName&&c.AddressLine1==contact.AddressLine1&&c.Zip==contact.Zip)||
(!String.IsNullOrEmpty(contact.Email)和&c.Email==contact.Email)).Count()>0

我被迫使用Where子句,然后使用大于0的计数来查找集合中是否存在任何重复项。我不明白的是,为什么LINQ对SQL上简单的任何子句都超时。 任何解释在这里都会很好

编辑

来自LINQpad的SQL 任何

在哪里


不完全确定这是否是您想要的,但您可以进行比较,我猜您不会经常运行测试,因为在将数据输入数据库之前最好先测试是否存在

如果你想找到复制品,那么

var queryA = from a in db.someTable
            select a.value;
foreach(var row in queryA){
Console.Write(queryA.Where(b => b == row).Count() > 1 ? row: "");
}
如果您只是想测试它是否存在,那么

var queryA = from a in db.someTable
            select a.value;
var queryB = queryA;
queryB.Distinct();
Console.Write(queryB.Count() != queryA.Count() ? "Yes" : "No");

很可能
Any()
方法中的linq to sql解析器没有生成好的查询。你有一个配置文件来检查它吗?这就是我的想法,但我没有生成的SQL。我使用了LINQPad,生成的SQL对于这两个方面几乎都是一样的,除了计数部分,我不想这么说,但这确实是一个好的LINQ性能工具派上用场的地方。您可能想看看我使用Hiberting Rhino的性能工具取得的巨大成功。查看LINQ查询生成的内容非常有趣。它帮助我明白了什么是不应该做的;-)谢谢,我去看看。我已经用LinqPad的SQL等效工具编辑了我的文章。查询仍然超时,但是如果我在Mangements studio中执行生成的SQL,结果是即时的。我知道我很困惑。这会起作用,但我必须运行多次。同样的逻辑也用于搜索记录和插入之前。我认为foreach实际上会增加算法时间。如果在插入前检查重要列,则不必在插入后检查。无论如何,您都希望在表上执行双循环,因为您必须检查数据本身。
var queryA = from a in db.someTable
            select a.value;
foreach(var row in queryA){
Console.Write(queryA.Where(b => b == row).Count() > 1 ? row: "");
}
var queryA = from a in db.someTable
            select a.value;
var queryB = queryA;
queryB.Distinct();
Console.Write(queryB.Count() != queryA.Count() ? "Yes" : "No");