[英]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.