1

以下のような質問があります。

bool variable = false//or true


var query = from e in _repository.GetAll<Entity>()
            from u in e.Users
            where (e.AuditQuestionGroupId != null ? e.AuditQuestionGroupId : 0) == this.LoggedInEntity.AuditQuestionGroupId
            from p in e.PractitionerProfiles.DefaultIfEmpty()
            select new { entity = e, user = u, profile = p };

これは正しく動作します。ただし、e.PractitionerProfiles への結合が DefaultIfEmpty を持つ必要があるかどうかを決定するブール変数があるため、内部結合ではなく左外部結合になります。

ただし、厄介なオブジェクトを使用しているため、正しく行う方法がわかりません。したがって、次のようにクエリ全体を複製することなく、左結合と内部結合を切り替える機能が必要です。

if(variable) {
            var query = from e in _repository.GetAll<Entity>()
                        from u in e.Users
                        where (e.AuditQuestionGroupId != null ? e.AuditQuestionGroupId : 0) == this.LoggedInEntity.AuditQuestionGroupId
                        from p in e.PractitionerProfiles
                        select new { entity = e, user = u, profile = p };
}
else {
            var query = from e in _repository.GetAll<Entity>()
                        from u in e.Users
                        where (e.AuditQuestionGroupId != null ? e.AuditQuestionGroupId : 0) == this.LoggedInEntity.AuditQuestionGroupId
                        from p in e.PractitionerProfiles.DefaultIfEmpty()
                        select new { entity = e, user = u, profile = p };
}

1 つのクエリでそれを行うクリーンな方法はありますか? 問題は、それに配置されるさらに多くの条件があることです。そのため、ループ内でクエリを宣言すると、ローカル変数がなく、空の IQueryable 匿名オブジェクトを作成する方法がわかりません。

4

2 に答える 2

4

三項演算子を使用しないのはなぜですか?

from p in (variable ? e.PractitionerProfiles : e.PractitionerProfiles.DefaultIfEmpty())
于 2015-06-15T04:52:40.227 に答える
0

最初のクエリの後にフィルターを追加し、e.PractionerProfiles が null かどうかを確認することで解決しました。

    var query = from e in _repository.GetAll<Entity>()
                from u in e.Users
                where (e.AuditQuestionGroupId != null ? e.AuditQuestionGroupId : 0) == this.LoggedInEntity.AuditQuestionGroupId
                from p in e.PractitionerProfiles.DefaultIfEmpty()
                select new { entity = e, user = u, profile = p };

それから

if (variable)
{
    query = query.Where(x => x.profile != null);
}
于 2015-06-18T00:14:47.920 に答える