【问题标题】:linq distinct on two columns and return as a single fieldlinq 在两列上不同并作为单个字段返回
【发布时间】:2017-04-20 09:53:37
【问题描述】:

我有一张如下表

Id username userid departmentname
1   abc     1234    test1
2   abc     3456    test1
3   abc     1234    test2
4   abc     3456    test2
5   def     8989    test1

我想在 username 和 userid 列上应用 distinct 并将这两列作为 linq 中的单个字段返回

所需的输出将低于

abc-1234
abc-3456
def-8989

我已经尝试了以下

[System.Web.Script.Services.ScriptMethod()]
            [System.Web.Services.WebMethod]
            public static List<string> getUserDetails(string prefixText, int count)
            {
                List<string> usernames = new List<string>();
                using (DBEntities context = new DBEntities())
                {
                    var distinctUsers = context.counters.Select(m => new { m.UserName, m.UserID }).Distinct().ToList();                
                    var abc = distinctUsers.Select(p => new  { DisplayText = p.UserName + "-" + p.UserID }).ToList();

                    usernames = abc.Where(r => r.DisplayText.StartsWith(prefixText)).ToList();               

                }
 return usernames;
            }

但我已经解决了这个问题。 1) 获得所需结果后,我需要使用以输入字符串(前缀文本)开头的列表进行过滤。我在变量 abc 中得到了所需的结果,并且可以获得以输入字符串开头的列表,但我得到的错误是“无法将类型列表匿名隐式转换为列表字符串。如何将列表匿名类型转换为列表字符串? 2)上述方法更好吗?或者有没有比这更好的方法?

谢谢'Ashique',我得到了它,没有在另一行代码中使用group by。

var distinctUsers = context.counters.Select(m => (m.UserName + "-" + m.UserID)).Distinct().ToList();
var abc = distinctUsers.AsParallel().Where(x => x.StartsWith(prefixText)).ToList();

默认情况下,上面也实现了我需要的顺序。它是默认订购还是我应该实现如下的订购方式:

 var distinctUsers = context.counters.Select(m => (m.UserName + "-" + m.UserID)).Distinct().OrderBy(n=>n).ToList();

【问题讨论】:

  • 使用“分组依据”

标签: sql linq


【解决方案1】:

你可以试试这个:

using (DBEntities context = new DBEntities())
                {
                    var distinctUsers = context.counters.Select(m => (m.UserName + "-" + m.UserID )).ToList();              
                      usernames = distinctUsers.GroupBy(g => g).Select(x => x.FirstOrDefault()).ToList();               

                }

using (DBEntities context = new DBEntities())
                {                                 
                      usernames = context.counters.Select(m => (m.UserName + "-" + m.UserID )).GroupBy(g => g).Select(x => x.FirstOrDefault()).ToList();               

                }

【讨论】:

  • 你能告诉我为什么 usernames = context.counters.Select(m => (m.UserName + "-" + m.UserID )).GroupBy(g => g).Select (x => x.FirstOrDefault()).ToList();比 usernames = context.counters.Select(m => (m.UserName + "-" + m.UserID )).Distinct().ToList();(这也包括 order by)更好
  • 一切都与性能有关。另一方面,Distinct() 将比较集合中的整个对象,GroupBy() 允许您按某个键对对象进行分组。如果您检查查询计划,可以检查这一点。
【解决方案2】:

试试这个:

create table abc1 as
select distinct concat(username,'-',userid) as result from abc
group by username;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多