我有这个查询
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
是唯一的,现在它返回重复的值。
这是怎么了?
答案 0 :(得分:3)
在查询结束时使用括号调用Dictinct
,您无需在此处进行分组。
var result = (from d in db.v_Report_CompanySearches
where d.PersonName.ToLower().Contains(mPersonName)
orderby d.PersonName ascending
select d.PersonName ).Distinct();
答案 1 :(得分:-1)
原始问题:Is there way to use Distinct in LINQ query syntax?
可接受的答案:
LINQ中的Distinct扩展方法没有查询语法 等效。
请参阅 http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx 有关原因的其他信息。
answer#2
语言集成查询中没有Distinct()方法语法 句法。您可以做的最接近的是移动当前通话:
var q = (from c in tbl select c.TABLE_TYPE).Distinct();
答案 2 :(得分:-1)
使用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);
答案 3 :(得分:-1)
使用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()
方法,结果将是
IEnumerable<CompanySearch>
假设db.v_Report_CompanySearches
是CompanySearch
的列表。结果将仅包含PersonName的唯一值,但其他字段仅填充第一个匹配项。
如果您只是select(g)
,则结果为Enumerable<IGrouping<string, CompanySearch>>
。该结果将包含与众不同的Personnames作为键(因为您按它们分组),但所有结果都作为值包含。 (您可以使用SelectMany
语句来提取它们,请参见How to get values from 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>
。