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 应用程序上执行此操作可能会更容易和更快。所以我得到了两个动态并且成员能力优先于角色能力,所以我需要检查是否使用循环。我确实喜欢这样:

   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();

Any help? Thanks

4

3 回答 3

2

Make sure that your object either implements System.IEquatable or overrides Object.Equals and Object.GetHashCode. In this case, it looks like you're storing the data as string[2], which won't give you the desired behavior. Create a custom object to hold the data, and do one of the 2 options listed above.

于 2012-02-09T00:32:39.930 回答
1

You might have to use ToList() after Distinct():

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

If I understand your question correctly you want to get a distinct set of arrays of strings, so if the same array exists twice, you only want one of them? The following code will return arrays one and three while two is removed as it is the same as one.

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 回答