1

我有一个包含列(Id,UserId,SendDate)的表(Send)和另一个包含列(Id,SendId,UserName)的表(Receive)。

我想用所有 RecieveUserName 显示 SendTable 中的所有记录。

例如。

(Send)
1   1   2013
2   2   2013


(Recieve)
1   1   Jack
2   1   Ema
3   2   Alex
4   2   Sara


Result
1   1   2013  Jack, Ema
2   2   2013  Alex, Sara

SqlServer我在(DISTINCT 关键字从 SELECT 语句的结果中消除重复行)中使用此查询

SELECT DISTINCT c2.Id,
(SELECT    STR( UserName )+ ','
 FROM         dbo.Reciver c1
 WHERE     c1.SendId = c2.id FOR XML PATH('')) Concatenated, c2.SendDate, c2.UserId
 FROM         dbo.Send AS c2 INNER JOIN
 dbo.Reciver ON c2.Id = dbo.Reciver.SendId

如何在 Linq 中进行此查询?

4

3 回答 3

2

Distinct也可在LINQ.

例如

public class Product
{
    public string Name { get; set; }
    public int Code { get; set; }
}

Product[] products = { new Product { Name = "apple", Code = 9 }, 
                   new Product { Name = "orange", Code = 4 }, 
                   new Product { Name = "apple", Code = 10 }, 
                   new Product { Name = "lemon", Code = 9 } };
var lstDistProduct = products.Distinct();
foreach (Product p in list1)
{
    Console.WriteLine(p.Code + " : " + p.Name);
}

将返回所有行。

var list1 = products.DistinctBy(x=> x.Code);

foreach (Product p in list1)
{
    Console.WriteLine(p.Code + " : " + p.Name);
}

将返回 9 和 4

于 2013-07-22T06:43:59.537 回答
1

在我看来,您不需要在此 Linq 查询中使用 Distinct。假设您在 linq 数据上下文中设置了表之间的关系,您可以执行以下操作:

var result = from s in context.Send
             select new {
                 id = s.Id,
                 userId = s.UserId,
                 date = s.SendDate,
                 users = s.Receive.Select(u => u.UserName)
             }

注意:您可以在客户端上使用 -users将名称连接成字符串。IEnumerable<String>string.Join()

更新

要将用户作为字符串返回,首先需要通过调用AsEnumerable()ToList()和 Linq to Sql 查询“切换”到 Linq To Objects。

var output = from s in result.AsEnumerable()
             select new {
                 id = s.id,
                 userId = s.userId,
                 date = s.date,
                 users = string.Join(", ", s.users)
             }

另请参阅Gert Arnolds 的回答以获得很好的解释。

于 2013-07-22T07:19:07.180 回答
1

你想要的只能分两步完成。不是因为DISTINCT,而是因为FOR XML。后者的 C# 等效项是String.Join(),但您不能直接在 linq to entity 语句中使用它。所以你必须先收集所需的数据,然后切换到 linq 到对象(通过应用 AsEnumerable),然后进行连接和区分:

 db.Sends
   .Where(s => s.Receivers.Any())
   .Select(s => new { 
                       s.Id, 
                       Concatenated = s.Receivers.Select(r => r.UserName)
                       s.SendDate,
                       s.UserId
                    })
   .AsEnumerable()
   .Select(x => new { 
                       s.Id, 
                       Concatenated = String.Join(", ", x.Concatenated)
                       s.SendDate,
                       s.UserId
                    })
   .Distinct()
于 2013-07-22T07:48:10.037 回答