3

ユーザーグループ内に動的フィールドがあり、ユーザーグループのユーザーに基づいてそれらを選択したいと考えています。

.Where(x => x.UserGroupId == x || ...基本的に、動的フィールドを取得するためだけに約20のクエリを作成するため、次のようなクエリをシミュレートしたいと考えています。

たぶん、どうにかして整数の配列を渡すことができUserGroupId、 でクエリをシミュレートします||

これが私の例です。両方の結果出力は同じです。違いは、最初のクエリにはデータベースへのクエリが 20 個あり、2 番目のクエリには 1 個しかないことだけです。

public IEnumerable<UserGroup> UserGroups
{
    get
    {
        var db = new MainDataContext();
        return db.UserGroupUsers.Where(x => x.UserId == this.Id).Select(x => x.UserGroup);
    }
}
public IEnumerable<UserDynamicField> DynamicFields
{
    get
    {
        var db = new MainDataContext();

        var fields = this.UserGroups.SelectMany(x => x.UserGroupDynamicFields); // 20+ queries

        var fields2 = db.UserGroupDynamicFields.Where(x =>
            x.UserGroupId == 1 ||
            x.UserGroupId == 2 ||
            x.UserGroupId == 3 ||
            x.UserGroupId == 4 ||
            x.UserGroupId == 5 ||
            x.UserGroupId == 6 ||
            x.UserGroupId == 7 ||
            x.UserGroupId == 8 ||
            x.UserGroupId == 9 ||
            x.UserGroupId == 10); // 1 query, maybe I can somehow pass array of Id's here?
    }
}
4

1 に答える 1

2

IQueryable<T>の代わりに に変換してみてくださいIEnumerable<T>:

public IQueryable<UserGroup> UserGroups
{
    get
    {
        var db = new MainDataContext();
        return db.UserGroupUsers.Where(x => x.UserId == this.Id)
                                .Select(x => x.UserGroup);
    }
}
public IQueryable<UserDynamicField> DynamicFields
{
    get
    {
        // 1 query
        return this.UserGroups.SelectMany(x => x.UserGroupDynamicFields); 
    }
}

これにより、Linq は、結果セットが反復されるまでメモリ内の結果セットをプルする必要がないという事実を利用できるため、これは従来の SQL 結合に変換されます。

于 2013-07-17T21:47:02.567 に答える