2012-06-19 213 views
7

在我的网页之一,我需要检查,如果有关客户输入的信息由复制可能已进入previously.Currently我用这Linq To SQL声明Linq查询是否有重复值

var duplicate = (from dup in dt.Data_Customer_Logs 
        where dup.cPanGirNo == panno 
          || dup.cEmail == email 
          || dup.nMobileNo.ToString() == mobno 
    select dup).Any(); 
尝试它 PAN NO,Email,Mobile No

它正在工作,但任何人都可以帮助我解决我的问题是什么正确的方法。如果没有记录发现会是什么结果。 欢迎任何建议。

+1

你到底是“它不工作”是什么意思? –

+0

@ErenErsönmez我尝试通过传递重复的电子邮件ID,但它没有执行“如果找到记录”部分。 – freebird

+0

它应该可以工作,但可能存在与大小写或前导/尾随空格有关的问题 –

回答

5
bool duplicateExists = dt.Data_Customer_Logs.Any(x => 
         x.cPanGirNo == panno 
         || x.cEmail == email 
         || x.nMobileNo.ToString() == mobno); 

这是一点点清洁剂,如果你只是想知道是否存在,或者没有这样的记录。我认为它会避免将多条记录带回客户端,然后IEnumerable<T>.Any做结果。

如果您还需要找回符合条件的记录,你可以使用IQueryable<T>.Where

var duplicates = dt.Data_Customer_Logs.Where(x => 
         x.cPanGirNo == panno 
         || x.cEmail == email 
         || x.nMobileNo.ToString() == mobno); 
if(duplicates.Any()) 
{ 
    // use duplicates... 
    foreach(var dup in duplicates) 
    { 
     //use dup.cEmail, dup.nMobileNo, etc. 
+0

我之前没有使用lambda表达式,能否向我解释一下您使用的查询。谢谢您的帮助。 – freebird

+0

当然。 'Any'中的所有内容都是lambda表达式。这里的lambda表达式用作像'bool myFunction (T x)'这样的函数。感谢C#的类型推断功能,我们不必明确指定'x'(T)的类型。 –

+0

另外如果我发现记录我怎么得到它们,我的意思是如何使用IEnumerable获取结果,一个小例子对我来说就足够了。感谢很多。 – freebird

2

试试这个

var duplicate = (from dup in dt.Data_Customer_Logs 
       where dup.cPanGirNo == panno 
         || dup.cEmail == email 
         || dup.nMobileNo.ToString() == mobno 
select dup).FirstOrDefault(); 

if(duplicate != null && duplicate.Any()) 
    //here logic of what should happend if there is something in db 
+0

好,所以你建议我首先检查它是否为null,然后使用Any(),我可以获取所有找到的记录。谢谢。 – freebird

+0

你应该先检查null总是避免NullReferenceException – harry180

+0

但是Any()返回true或false,所以如果它为null,它会抛出异常。不确定。 – freebird