[英]How to apply distinct to linq query in c#?
我有这个查询
from d in db.v_Report_CompanySearches
where d.PersonName.ToLower().Contains(mPersonName)
orderby d.PersonName ascending
group d by d.PersonName into g
select (g);
但是当我只想要PersonName
时,它返回所有列。 另外,我想确保PersonName
是不同的,现在它返回重复的值。
怎么了
在查询末尾使用括号调用Dictinct
,您无需在此处进行分组。
var result = (from d in db.v_Report_CompanySearches
where d.PersonName.ToLower().Contains(mPersonName)
orderby d.PersonName ascending
select d.PersonName ).Distinct();
原始问题: 有没有办法在LINQ查询语法中使用Distinct?
接受的答案:
LINQ中的Distinct扩展方法没有等效的查询语法。
有关原因的其他信息,请参见http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx 。
答案2
语言集成查询语法中没有Distinct()方法语法。 您能做的最接近的是移动当前通话:
var q = (from c in tbl select c.TABLE_TYPE).Distinct();
使用g.First()
from d in db.v_Report_CompanySearches
where d.PersonName.ToLower().Contains(mPersonName)
orderby d.PersonName ascending
group d by d.PersonName into g
select (g.First().PersonName);
使用select (g.key)
仅选择分组键。
from d in db.v_Report_CompanySearches
where d.PersonName.ToLower().Contains(mPersonName)
orderby d.PersonName ascending
group d by d.PersonName into g
select (g.Key);
在您的情况下,假设PersonName是字符串,结果将是Enumerable<string>
。
如果您使用另一个答案建议的g.First()
方法,则假定db.v_Report_CompanySearches
是CompanySearch
的列表,结果将是IEnumerable<CompanySearch>
。 结果将仅包含PersonName的唯一值,但其他字段仅填充第一个匹配项。
如果仅select(g)
则结果为Enumerable<IGrouping<string, CompanySearch>>
该结果将包含与众不同的Personnames作为键(因为您按它们分组),但将所有结果都包含为值。 (您可以使用SelectMany
语句提取它们,请参阅如何从IGrouping获取值 )。
由于我的答案被否决了,因此我举一个例子,每个人都可以执行并检查其有效性:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return $"{Name}: {Age}";
}
}
static void Main(string[] args) {
personList = new List<Person>()
{
new Person {Name = "Jay", Age = 25},
new Person {Name = "Hans", Age = 25},
new Person {Name = "Fritz", Age = 25},
new Person {Name = "Hello", Age = 26},
new Person {Name = "World", Age = 27},
new Person {Name = "Whatever", Age = 26},
new Person {Name = "ASDF", Age = 24},
new Person {Name = "Foo", Age = 25},
new Person {Name = "Bar", Age = 22},
};
var ages = from p in personList
where p.Age > 22
orderby p.Age ascending
group p by p.Age into g
select (g);
Console.WriteLine($"select(g): {ages.GetType()}");
var ages2 = from p in personList
where p.Age > 22
orderby p.Age ascending
group p by p.Age into g
select (g.First());
Console.WriteLine($"select(g.First()): {ages2.GetType()}");
var ages3 = ages.First();
Console.WriteLine($"(select(g)).First(): {ages3.GetType()}");
}
在输出中,您可以看到第一个是IEnumerable<IGrouping<int,Person>>
,第二个输出是IEnumerable<Person>
,第三个是IGrouping<int,Person>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.