3

EF 5 から次の例外が発生しています: SQL ステートメントの一部がネストされすぎています。クエリを書き直すか、小さなクエリに分割します。

ここに私のクエリがあります:

String username = “test”;
IEnumerable<Int32> roles;
IEnumerable<Int32> applications;

cnx.Users.Where ( it =>
( userName != null ?  it.name = = userName : true )  &&
( !roles.Any () || roles.Contains ( it.role_id ) ) &&
( ! applications.Any () || applications.Contains ( it.application_id ) ) )
               .Count ();

ユーザーは単純なテーブルです。役割とアプリケーションはどちらも IEnumerable 型であり、空にすることができます。

クエリを EF 5 (.Net 4.0) で動作するように変更するにはどうすればよいですか?

4

2 に答える 2

6

userName私にとっては、rolesとのように見えapplicationsますが、クエリのパラメーターです。つまり、データはデータベースからではなく、アプリケーションから取得されます。その場合、次のようにクエリを記述します。

IQueryable<User> query = cnt.Users;
if(userName != null)
    query = query.Where(x => x.name == userName)
if(roles.Any())
    query = query.Where(x => roles.Contains(x.role_id));
if(applications.Any())
    query = query.Where(x => applications.Contains(x.application_id))

var result = query.Count();

これははるかに読みやすく、結果のクエリに不要な混乱が含まれません。

rolesandapplicationsは、別のクエリの未実行の結果を表してはならないことに注意してください。「未実行の結果」とは、次のことを意味します。

IEnumerable<Role> roles = context.Roles.Where(x => x = y);
于 2013-09-25T10:59:39.837 に答える
0

別の解決策は、レコードを反復処理して別のレコードを取得し、最終的なリストに集約することです。

最速でも美しさでもありませんが、解決します。

于 2014-08-12T14:08:49.773 に答える