linq在两列上不同并作为单个字段返回

时间:2017-04-20 09:53:37

标签: sql linq

我有一张表格如下

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)一旦我得到了所需的结果,我需要使用以输入字符串(prefixtext)开头的列表进行过滤。我在变量abc中得到了所需的结果,并且能够获得以输入字符串开头的列表,但我得到的错误是“不能隐式地将类型列表匿名转换为列表字符串”。如何将列表匿名类型转换为列表字符串? 2)上述方法更好吗?或者有没有比这更好的方法?

谢谢你&#39; Ashique&#39;,我已经得到了如下,而没有在另一行代码中使用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();

2 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

你可以试试这个:

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

                }