如何在C#中将不同应用于LINQ查询?

时间:2018-10-03 20:42:25

标签: c# linq

我有这个查询

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是唯一的,现在它返回重复的值。

这是怎么了?

4 个答案:

答案 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_CompanySearchesCompanySearch的列表。结果将仅包含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>