SQL クエリを Linq に変換しようとすると、例外が発生します。
System.NotSupportedException : ローカル コレクションを使用したクエリはサポートされていません。
それで、「合法的な」方法でクエリを言い換える方法はありますか?
ご提案ありがとうございます。
アンダース、デンマーク
PS: .Contains() を呼び出す前に任意のクエリで .ToList() を呼び出す「解決策」を見てきましたが、それでは 4 つの個別のクエリが発生するだけですよね?
下部にあるのは、実行時に失敗する私のコードです。
私が解決しようとしている論理的な問題は、直接アクセスするか、アクセス権を持つグループのメンバーシップによって、ユーザーがアクセスできる「構造」を見つけることです。ネストされたグループはありません。
つまり、次のいずれかに該当する場合、ユーザーはアクセス権を持つ必要があります。
- ユーザーが構造を作成しました (ID は構造レコードに「スタンプされます」)。
- PermissionUsers テーブルにエントリが存在し、Permissions テーブルと users テーブルをリンクします。
- PermissionGroups テーブルにエントリが存在し、Permissions テーブルを Groups テーブルにリンクし、UsersGroups テーブルでユーザーが参照され、Users テーブルを Users テーブルにリンクします。
アクセス可能なアイテムにパーミッションを適用/結果を制限することは比較的新しいことであり、データベースに重いプルを実行させたいと考えています;)。
[TestFixture]
public class LinqTest : CommandBasedIntegrationTestBase
{
[Test, Category("SuperIntegration"), RequiresSTAAttribute]
public void TestThat()
{
DbIntegrationTestHelper.SetState();
var dataContextProvider = ObjectFactory.GetInstance<IDataContextProvider>();
const int userId = 1;
var environment = ObjectFactory.GetInstance<IState>().DatabaseEnvironment;
var dataClasses1DataContext = dataContextProvider.GetContext(environment);
var idsByCreator = from r in dataClasses1DataContext.Structures where r.CreatedUserId == userId select r.StructureId;
var idsByUserAccess = from r in dataClasses1DataContext.PermissionUsers where r.UserId == userId select r.StructureId;
var idsOfGroupsContainingUser = from r in dataClasses1DataContext.UsersGroups where r.UserId == userId select r.GroupId;
var idsByGroupAccess = from r in dataClasses1DataContext.PermissionGroups where idsOfGroupsContainingUser.Contains( r.GroupId ) select r.StructureId;
var res = from s in dataClasses1DataContext.Structures
where
idsByCreator.Contains(s.StructureId) ||
idsByUserAccess.Contains(s.StructureId) ||
idsByGroupAccess.Contains(s.StructureId)
select s;
foreach (var structure in res)
{
Debug.WriteLine(structure.Name);
}
}
}