【问题标题】:Linq query correct wayLinq查询正确方法
【发布时间】:2014-02-25 17:59:28
【问题描述】:

我想要一个名字相同但出生年份在 1960 年之前或 1970 年之后的人的列表。

这只是一个练习查询,我正在使用 intersect,通过它我只得到名字,但是如果我想要整个对象怎么办?

我试过这个,效果很好。

using Chapter01Samples;

var contacts = Contact.SampleData();
var callLog = CallLog.SampleData();

var result = from contact in contacts
             group contact by contact.FirstName into person
             where person.Any( c => c.DateOfBirth.Year > 1970) 
                               && person.Any(c => c.DateOfBirth.Year < 1960)
             select person;

但如果有更好的查询,我想知道

编辑:如果有两个人名叫亚当,一个人的出生年份是 58 岁,一个人是 72 岁,那么只有我应该收到这两个对象。两个类别中应存在相同的名称。

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    我怀疑你只需要颠倒你的 wheregroup by 子句。先过滤,再分组:

    var result = from contact in contacts
                 where contact.DateOfBirth.Year > 1970 ||
                       contact.DateOfBirth.Year < 1960
                 group contact by contact.FirstName;
    

    注意从 &amp;&amp;|| 的变化,因此我们只收集出生于 1960 年之前在 1970 年之后的人。

    如果这不是您想要的,请提供更多详细信息。特别是,如果您试图找到“1960 年之前出生的人与至少一个 1970 年之后出生的人有同一个名字”,那么我会将其分为几个阶段。首先对用户进行过滤和分组,因此我们将 1960 年之前出生的人按名字分组,将 1970 年之前出生的人按名字分组。然后,您可以对这些组执行内部联接,任何具有相同键(名字)的组对的结果只是两个组成员的串联。

    // No offence intended by these names...
    var oldGroups = contacts.Where(contact => contact.DateOfBirth.Year < 1960)
                            .GroupBy(p => p.FirstName);
    var youngGroups = contacts.Where(contact => contact.DateOfBirth.Year > 1970)
                              .GroupBy(p => p.FirstName);
    var query = oldGroups.Join(youngGroups, og => og.Key, yg => yg.Key,
                               (og, yg) => og.Concat(yg));
    

    【讨论】:

    • doesnt this statement contact.DateOfBirth.Year > 1970 && contact.DateOfBirth.Year 1970和
    • 对不起,这是上一条评论,在当前情况下,即使只有一个人的出生日期>1970 或 1970,他们将被包括在内
    • @ZaidBinIrfan:是的,会的。听起来您没有正确解释您的要求。如果您能提供示例输入和预期输出,将会有所帮助。
    • @ZaidBinIrfan:我已经根据我认为您可能想要的内容编辑了我的答案。
    • @Jon...谢谢,这让我得到了相同的输出,是的,我应该详细说明我的要求。所以你会建议哪一个,你的解决方案听起来更正确,我的写起来更短,但我不确定它执行了多少语句。
    【解决方案2】:
    var contacts = Chapter01Samples.Contact.SampleData();
    
    var query = contacts.Where(c => c.DateOfBirth.Year > 1970 || c.DateOfBirth.Year < 1960)
                        .GroupBy(c => c.FirstName);
    

    【讨论】:

      【解决方案3】:

      如果你使用 Datatable 或 dataset 那么它会像
      dataTable.Select("Your simple where clause and other clauses")
      或者如果您使用
      dataSet.Table[0].Select("Your simple where clause and other clauses")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        相关资源
        最近更新 更多