2

EF モデル内のユーザー エンティティのナビゲーション プロパティである列で注文する必要があるシナリオがあります。

エンティティ: ユーザー --> 国 1:n の関係

単純な SQL クエリは次のようになります。

SELECT UserId, u.Name, c.Name
FROM users u join countries c on u.CountryId = c.CountryId
ORDER BY c.Name asc;

それで、次のようにLinq to Entitiesを使用して上記のSQLクエリを複製しようとしました-(遅延読み込みが有効になっています)

entities.users.OrderBy(field => field.country.Name).ToList();

しかし、このクエリは、上記のネイティブ SQL クエリのように国名でソートされた国を返しません。

ただし、もう少し続けて、次のことを行いました。

var enumeratedUsers = entities.users.AsEnumerable();
users = enumeratedUsers.OrderBy(fields => fields.country.Name).ToList();

しかし、enumeratedUser オブジェクトで約 50 レコードの順序付けを行うには、約 50 分かかりました。7秒

Enumerable を省略し、匿名型を返さずに行うより良い方法はありますか?

ありがとう

編集

EF プロバイダーは MS SQL ではなく MySQL であることを忘れていました。実際、MS SQL のレプリケートされたデータベースで同じクエリを試したところ、クエリは正常に機能しました。つまり、国名が正しく順序付けられているため、MySQL から結果セットを取得して順序を実行する以外に選択肢がないように見えます。列挙可能なオブジェクトのメモリから

4

4 に答える 4

6
var enumeratedUsers = entities.users.AsEnumerable();
users = enumeratedUsers.OrderBy(fields => fields.country.Name).ToList();

これは LINQ to Objects であり、LINQ to Entities ではありません。

上記の Order By 句はEnumerableで定義されたOrderByを呼び出します

つまり、注文はメモリ内で行われます。したがって、長い時間がかかります

編集

MySQL関連の問題のようです

このようなことを試すことができます。

        var users = from user in entities.users
                          join country in entities.Country on user.CountryId equals country.Id
                          orderby country.Name
                          select user;
于 2011-07-15T07:25:25.557 に答える
3

entities.users.OrderBy(field => field.country.Name).ToList();

しかし、このクエリは、上記のネイティブ SQL クエリのように国名でソートされた国を返しません。

はい、返されませんが、国名でソートされるCountriesだけです。Users このクエリが実行されると、次の sql が DB に送信されます。

SELECT u.*
FROM users u join countries c on u.CountryId = c.CountryId
ORDER BY c.Name asc;

ご覧のとおり、結果には のフィールドは含まれていませんcountries。あなたが遅延読み込みについて言及したようcountiresに、必要に応じてそれを介して読み込まれます。このとき、countries遅延ロードを介して呼び出す順序どおりに並べられます。countriesエンティティ セットの Local プロパティを介してアクセスできます。

userこの点は、名前で並べ替え、名前で並べ替えcountryたい場合はcountires、@Dennis が次のように言及したように熱心にロードする必要があることを示しています。

entities.users.Include["country"].OrderBy(field => field.country.Name).ToList();

これは、次の sql に変換されます。

SELECT u.*, c.*
FROM users u join countries c on u.CountryId = c.CountryId
ORDER BY c.Name asc;
于 2011-07-15T08:41:58.700 に答える
0

使ってみましたIncludeか?

entities.users.Include["country"].OrderBy(field => field.country.Name).ToList();
于 2011-07-15T07:17:45.610 に答える
0

解決

Country テーブルと Users テーブルの両方に Name という名前の両方の列があったため、order by country.Name が実行されたときに MySQL Connector がこの出力を生成していました。

SELECT `Extent1`.`Username`,  `Extent1`.`Name`,  `Extent1`.`Surname`, `Extent1`.`CountryId`
FROM `users` AS `Extent1` INNER JOIN `countries` AS `Extent2` ON `Extent1`.`CountryId` = `Extent2`.`CountryId`
ORDER BY `Name` ASC

したがって、これは、countries.Name ではなく users.Name の順序になります。

ただし、MySQL にはバージョン 6.4.3 の .NET コネクタがリリースされており、多くの問題が解決されています。

また、エンティティ フレームワーク プロバイダーに関連する SQL 生成の改善もいくつか含まれています。ソース: http://forums.mysql.com/read.php?3,425992

ご意見をお寄せいただきありがとうございます。私は、同じ問題に遭遇する可能性のある他の人を助けるために、できるだけ明確にしようとしました.

于 2011-07-15T18:39:38.127 に答える