1

CoolStorageをORMとして使用していますが、データベースがクエリされる頻度について質問があります。

チームのリストを返します。また、各チームに含まれるユーザーの数を表示したいと思います。私は電話Team.List()でチームを返還していますが、ユーザー数を返還する方法を考えることができる2つのオプションがあります。1つは、[OneToMany] SysUsersのカウントを返すプロパティをTeamクラスに追加することで、もう1つは、によって返された結果にLINQを使用することTeam.List()です。以下のコードは両方のメソッドを示しており、どちらも同じ結果を返します。

これがデータベースの相互作用にどのように影響するかを理解しようとしています。たとえば、最初にチームのリストを返し、次に各チームに対して個別のクエリを実行してユーザー数を取得しますか?次に、さらに2つまたは3つのフィールドを追加したい場合、追加のフィールドごとに別の個別のクエリを実行しますか?2つのアプローチに違いはありますか?

私の懸念は、接続がうまくいかない場合、単純なクエリでさえ応答しなくなる可能性があることです。

CoolStorageには、代わりにアドホックSQLクエリを実行するオプションがありますが、より複雑なクエリの代わりにこれを実行する方がよいでしょうか。それとも私は何も心配していませんか?

CSList<Team> teams = Team.List();

// Counting number of objects
var d = from t in teams
        select new
        {
            TeamID = t.TeamID,
            TeamName = t.TeamName,
            NoUsers = t.SysuserTeams.Count
        };

// Using property added to Team class
var e = from t in teams
        select new
        {
            TeamID = t.TeamID,
            TeamName = t.TeamName,
            NoUsers = t.NumberOfUsers
        };

DataGridView dgv = this.dgvTeams;
dgv.DataSource = d.ToList();
// Same result as 
dgv.DataSource = e.ToList();
4

1 に答える 1

1

生成されたSQLログから、チーム結果の各行に対して新しいクエリが実行されていることがわかり、きちんとしたソリューションに親切に対応してくれたCoolStorage開発者と連絡を取りました。

2つのオプションがあります。のOneToManyプロパティにSysusersタグを付ける[Prefetch]か、これをクエリごとに明示的に指定することができますTeam.List().WithPrefecth("Users")。いずれにせよ、行ごとのクエリではなく、ユーザーレコードに対して1つの追加クエリのみを実行するようになりました。

于 2012-12-20T11:22:03.933 に答える