0

我有一个 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.

我在这里遗漏了什么?

EDIT1:第一部分获取实体。

        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();
4

2 回答 2

0

如果您尝试在单个 Linq 请求中获取与指定person.IDcontactAddress.LINE1值匹配的第一个地址条目(任何人的),那么您应该尝试以下代码:

pPeople_Address recordExists = people.SelectMany(p => p.pPeople_Address)
                                     .FirstOrDefault(a => a.People_ID == person.ID &&
                                                          a.Address1 == contactAddress.LINE1);
于 2013-10-29T16:40:50.380 回答
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() 这样的调用来获得具体结果的原因。

编辑:根据您的“EDIT 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();

对不起查询语法,但在我看来,这是做我认为你正在尝试的最干净的方法。

于 2013-10-29T16:53:09.983 回答