簡體   English   中英

Linq中等效的DISTINCT(sql server)是什么

[英]What is the equivalent DISTINCT(sql server) in the Linq

我有一個表(發送)與列(Id,UserId,SendDate)和另一個表(接收)與列(Id,SendId,UserName)。

我希望使用所有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中查詢?

LINQ也提供了Distinct功能。

例如

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

在我看來,你不需要在這個Linq查詢中使用Distinct。 假設您在linq datacontext上設置了表之間的關系,您可以執行以下操作:

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的答案以獲得一個很好的解釋。

你想要的只能分兩步完成。 不是因為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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM