0

私のEFオブジェクトクエリは次のとおりです。

from customer in MCDBContext.Customers
join customerCase in MCDBContext.CustomerCases on customer.CustomerID equals customerCase.CustomerID
join customerCasePhone in MCDBContext.CustomerCasePhones on customerCase.CustomerCaseID equals customerCasePhone.CustomerCaseID
**join customerCaseAddress in MCDBContext.CustomerCaseAddresses on customerCase.CustomerCaseID equals customerCaseAddress.CustomerCaseID**

where customer.CustomerPIN.Equals(pin, StringComparison.InvariantCultureIgnoreCase) &&
        customerCasePhone.PhoneNumber.Equals(phoneNumber, StringComparison.InvariantCultureIgnoreCase) &&
        **customerCaseAddress.AddressTypeID == 6** &&
        customerCase.IsActive == true && customerCasePhone.IsActive == true && customerCaseAddress.Active == true && customer.IsActive == true
select customer;

コード内:

var customers = getmethod() //calls the above object query method. 

customers.First().CustomerAddresses();//オブジェクトクエリでTypeID=6のみを実行するようにフィルタリングしましたが、//すべての顧客アドレスを返します。なぜそうなのか?フィルタ条件を再度書き込みたくありません。何か案は?

ありがとう。

4

1 に答える 1

1

クエリは、顧客ごとにすべてのアドレスを返すわけではありません。アドレスはまったく返されません。ナビゲーションプロパティにアクセスすると、遅延読み込みが発生するため、アドレスが後で読み込まれます。これは2番目のクエリであり、遅延読み込みでは常にすべてのアドレスが返されます。

単一のデータベースクエリで目的の結果を取得する場合は、select操作で顧客とアドレスをロードするための予測が必要です。

ナビゲーションプロパティを利用すると(質問の下にタグがあるため、いくつかあると思います)、次のようになります。

var result = MCDBContext.Customers
    .Where(customer => customer.IsActive && customer.CustomerPIN.Equals(
           pin, StringComparison.InvariantCultureIgnoreCase)
        && customer.CustomerCases.Any(ccase =>
               ccase.IsActive
            && ccase.CustomerCasePhones.Any(phone => 
                   phone.IsActive
                && phone.PhoneNumber.Equals(
                   phoneNumber, StringComparison.InvariantCultureIgnoreCase))
            && ccase.CustomerCaseAddresses.Any(address =>
                   address.IsActive
                && address.AddressTypeID == 6)))
    .Select(customer => new
    {
        Customer = customer,
        // you can also fetch here cases and phones, if you need them
        Addresses = customer.CustomerCases.Where(ccase => ccase.IsActive)
            .Select(ccase => ccase.CustomerCaseAddresses
               .Where(address => address.IsActive && address.AddressTypeID == 6))
    })
    .ToList();

これは、顧客のオブジェクトツリーにアドレスコレクションを設定せず、匿名オブジェクトのリストのみを返します。各エントリには、顧客とこの顧客のフィルタリングされたアドレスが含まれます。

于 2012-03-31T19:53:44.963 に答える