0

数日前から解決しようとしている問題よりも少し複雑な問題があります。私は 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();

何か助けはありますか?ありがとう

4

3 に答える 3

2

オブジェクトが System.IEquatable を実装しているか、Object.Equals と Object.GetHashCode をオーバーライドしていることを確認してください。この場合、データを string[2] として保存しているように見えますが、これでは目的の動作が得られません。データを保持するカスタム オブジェクトを作成し、上記の 2 つのオプションのいずれかを実行します。

于 2012-02-09T00:32:39.930 に答える
1

Distinct() の後に ToList() を使用する必要がある場合があります。

List<string[]> distinct = data.Distinct().ToList();
于 2012-02-09T00:31:29.090 に答える
1

私があなたの質問を正しく理解していれば、文字列の配列の個別のセットを取得したいので、同じ配列が2つ存在する場合、そのうちの1つだけが必要ですか? 次のコードは配列 1 と 3 を返しますが、2 は 1 と同じであるため削除されます。

var one = new[] {"One", "Two"};
var two = new[] {"One", "Two"};
var three = new[] {"One", "Three"};

List<string[]> list = new List<string[]>(){one, two, three};


var i = list.Select(l => new {Key = String.Join("|", l), Values = l})
    .GroupBy(l => l.Key)
    .Select(l => l.First().Values)
    .ToArray();
于 2012-02-09T00:51:52.513 に答える