数日前から解決しようとしている問題よりも少し複雑な問題があります。私は PetaPoco ORM を使用していますが、次のような複雑なクエリを実行する他の方法は見つかりませんでした。
var data = new List<string[]>();
var db = new Database(connectionString);
var memberCapabilities = db.Fetch<dynamic>(Sql.Builder
.Select(@"c.column_name
,CASE WHEN c.is_only_view = 1
THEN c.is_only_view
ELSE mc.is_only_view end as is_only_view")
.From("capabilities c")
.Append("JOIN members_capabilities mc ON c.capability_id = mc.capability_id")
.Where("mc.member_id = @0", memberID)
.Where("c.table_id = @0", tableID));
var roleCapabilities = db.Fetch<dynamic>(Sql.Builder
.Select(@"c.column_name
,CASE WHEN c.is_only_view = 1
THEN c.is_only_view
ELSE rc.is_only_view end as is_only_view")
.From("capabilities c")
.Append("JOIN roles_capabilities rc ON c.capability_id = rc.capability_id")
.Append("JOIN members_roles mr ON rc.role_id = mr.role_id")
.Where("mr.member_id = @0", memberID)
.Where("c.table_id = @0", tableID));
ユーザーの機能を取得しようとしていますが、システムには実際にユーザーに機能を割り当てる方法、またはそのユーザーに指示する方法、またはユーザーを役割に割り当てる方法があります。ストアド プロシージャを使用してこのマージされたリストを取得したかったのですが、カーソルが必要だったので、Web アプリケーションでこれを行う方が簡単で速いと思いました。したがって、2 つのダイナミクスとメンバーの機能がロールの機能よりも優先されるため、ループを使用して確認する必要があります。そして、私はこれが好きでした:
for (int i = 0; i < roleCapabilities.Count; i++)
{
bool added = false;
for (int j = 0; j < memberCapabilities.Count; j++)
if (roleCapabilities[i].column_name == memberCapabilities[j].column_name)
{
data.Add(new string[2] { memberCapabilities[j].column_name, Convert.ToString(memberCapabilities[j].is_only_view) });
added = true;
break;
}
if (!added)
data.Add(new string[2] { roleCapabilities[i].column_name, Convert.ToString(roleCapabilities[i].is_only_view) });
}
したがって、計画は重複したエントリを削除することです。次の方法を使用してみましたが、結果はありません。
data = data.Distinct();
何か助けはありますか?ありがとう