2013-10-29 159 views
0

我有一个LINQ查询,我不明白为什么它不会返回任何结果,即使条件为真。LINQ查询不返回结果

我将TBL_CONTACTAddress contactAddress, pPeople person传递给我的方法。

我的LINQ查询看起来像:

pPeople_Address recordExists = people 
    .Select(p => p.pPeople_Address 
        .Where(a => a.People_ID == person.ID 
          && a.Address1 == contactAddress.LINE1) 
        .FirstOrDefault()) 
    .FirstOrDefault(); 

如果我将鼠标悬停在过去FirstOrDefault()它说,它返回pPeople_Address。当我调试它时,person.IDcontactAddress.LINE1都提供了正确的输入。该记录存在于IEnumerable<pPeople> people

我错过了这里的东西?

编辑1:第一部分获取实体。

 using (CRMEntities crm = new CRMEntities()) 
     { 
      people = crm.pPeoples.Where(p => p.import_num == ImportNumber).Select(p => p).AsEnumerable().ToList(); 
     } 

第二部分是更新的信息,看是否记录存在

private void GetAddressGeneric(TBL_CONTACT contact, pPeople person, CRMEntities crm) 
    { 
      foreach (TBL_ADDRESS contactAddress in contact.TBL_ADDRESS.Where(n => n.LINE1 != null)) 
      { 
       var address = new pPeople_Address(); 

       pPeople_Address recordExists = people.Select(p => p.pPeople_Address.FirstOrDefault(a => a.People_ID == person.ID && a.Address1 == contactAddress.LINE1)).FirstOrDefault(); 

    } 

EDIT2:下面的代码来完成我想要的,但我希望能够做到在一个单一的LINQ语句

   var recordExists = people.FirstOrDefault(p => p.pPeople_Address.Any(a => 
                        a.People_ID == person.ID && 
                        a.Address1 == contactAddress.LINE1)); 
       pPeople_Address record = recordExists.pPeople_Address.FirstOrDefault(); 
+0

提供一个完整的可编译示例来演示您的问题,在这种情况下,创建一个包含足够数据的示例数据结构,以便返回结果但不包含结果。 – Servy

+0

您确定“people”变量包含您筛选的信息是否存在基于过滤字段person.ID和contactAddress.LINE1? –

+0

你想选择什么? pPeople_Address或人物对象? – alexmac

回答

0

如果你想,在一个单一的LINQ的请求,得到的第一个地址条目(任何人)符合指定person.IDcontactAddress.LINE1值TH恩,你应该试试这个代码:

pPeople_Address recordExists = people.SelectMany(p => p.pPeople_Address) 
            .FirstOrDefault(a => a.People_ID == person.ID && 
                  a.Address1 == contactAddress.LINE1); 
0

首先,我想你的表情改写为这样的:

pPeople_Address recordExists = 
     people.Where(a => a.People_ID == person.ID && a.Address1 == contactAddress.LINE1) 
     .Select(p => p.pPeople_Address) 
     .FirstOrDefault(); 

如果你还没有得到你想要的结果,您可以尝试调试一些中间变量找出问题所在。例如:

var matchingPeople = 
     people.Where(a=> a.People_ID == person.ID && a.Address1 == contactAddress.LINE1).ToList(); // Depending on your data, calling ToList() on this expression may not be feasible 
    var matchingAddresses = 
     matchingPeople.Select(p => p.pPeople_Address).ToList(); 
    var firstMatchingAddress = 
     matchingAddresses.FirstOrDefault(); 

注:LINQ查询操作被推迟,这意味着直到您尝试实际消耗数据,不执行查询。这就是为什么像ToList()和FirstOrDefault()这样的调用是获得具体结果所必需的。

编辑:基于您的“编辑2”,我相信你正在寻找的是

pPeople_Address record = (from p in people 
          from a in p.people_Address 
          where a.People_ID == person.ID && a.Address1 == contact.Address.LINE1 
          select a).FirstOrDefault(); 

很抱歉的查询语法,但在我看来,这是做什么,我觉得最彻底的方法你正在努力。