0

条件が true の場合でも、結果が返されない理由がわからない 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();
        }

2番目の部分は、情報を更新し、レコードが存在するかどうかを確認しています

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:以下のコードは私が望むことを達成しますが、1つの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

まず、あなたの表現を次のように書き直します。

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

クエリの構文については申し訳ありませんが、私の意見では、これはあなたがしようとしていることを行うための最もクリーンな方法です。

于 2013-10-29T16:53:09.983 に答える