0

私はlinqに慣れていません。私はEF4.0を使用しています。私は常にラムダ式を使用して、次のようなデータを取得しています。

List<User> users = db.Users
                        .Include(u => u.Licences)
                        .Include(u => u.Licences.Select(l => l.LicenceProducts.Select(lp => lp.Product)))
                        .Include(u => u.UserAddress)
                        .Include(u => u.Contact)
                        .Include(u => u.User2)
                        .Include(u => u.SupportProducts)
                        .Where(u => u.Type != (int)UserType.Admin)
                        .OrderBy(u => u.Name)
                        .ToList();

残念ながら、実行には多くの時間がかかります。したがって、左結合を使用して変更したいのですが、Linq で結合がどのように機能するかを正しく理解していません。

これが私が試したことです:

users = from user in db.Users
        join licence in db.Licences on user.UserID equals licence.UserID
        join licenceProduct in db.LicenceProducts on licence.LicenceID equals licenceProduct.LicenceID...;

返される型は、以前と同じではありません (リスト)

私もこれを試しましたが、同じ問題があります

users = db.Users
    .Join(db.Licences, lic => lic.UserID, user => user.UserID, (user, lic) => new { user, lic })
4

2 に答える 2

2

結合は と同じではありませんIncludeInclude■ EF に、関連付けられたナビゲーション プロパティをメイン クエリ内のエンティティから移入するように指示します。ただし、結合は SQL 結合のみを実行し、何も入力しません。

子オブジェクトまたは親オブジェクトのプロパティをフィルター処理する場合は、通常、結合を使用します。Like join c in Contacts ... where c.Name == "..."– これは、連絡先が入力されていない場合にのみ返されますUsers。SQLSELECT句には User 列のみが含まれます。(まあ、個別のユーザーのみを選択すると仮定します)。

Include■ SQL 結合も生成しますが、同時に、含まれるエンティティのすべての列をSELECT句に入れます。クエリ結果セットは、含まれるすべてのエンティティを具体化するために使用されます。sが多い場合Include、この結果は幅と長さが信じられないほど大きくなります。含まれるすべてのエンティティのすべての列を選択するため、幅です。含まれている各子コレクションが結果セットをその行数で乗算するため、長さが異なります。

したがって、 を3 つ Include以下にすることをお勧めします。Includeしたがって、本当に必要な sの数を再考する必要があると思います。関連するエンティティを個別のクエリで読み込む方がおそらくはるかに効率的です。

于 2013-11-04T18:16:46.463 に答える
1

使用している結合は、左結合ではなく内部結合です。DefaultIfEmpty()ここで説明されているように、それらを左結合に変換するために使用できます: http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx

また、linq を使用すると、リストではなくクエリを作成することに注意してください。クエリは、結果を取得する必要がある場合にのみ実行されます。これを行うために呼び出すことができますToList()。一般に、データの取得に LINQ を使用している場合は、遅延実行について読むことが重要です (ここでの適切な説明: http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution. aspx )、そうしないと、クエリが作成されてから実行されるまでの間にデータが変化した場合、取得するデータが予期したものと異なる場合があります。

また、それだけ多くのインクルードがあるため、ストアド プロシージャを使用する方が簡単だと思います。

于 2013-11-04T17:13:36.020 に答える