【问题标题】:Linq left join and whereLinq 左连接和在哪里
【发布时间】:2014-07-07 21:24:47
【问题描述】:
i'm learning the book:

LINQ to Objects 使用 C# 4.0

好的,我的问题:

我有两个类:ContactCallLog。它看起来像:

public class Contact
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public DateTime DateOfBirth { get; set; }
        public string State { get; set; }
};

public class CallLog
    {
        public string Number { get; set; }
        public int Duration { get; set; }
        public bool Incoming { get; set; }
        public DateTime When { get; set; }
    }

关系:Contact.Phone 等于 CallLog.Number

两个类有方法:SampleData()。此方法返回一个简单的列表,其中包含联系人和通话记录。

List<Contact> contacts = Contact.SampleData();
List<CallLog> callLogs = CallLog.SampleData();

我的查询是:每个联系人打了多少电话。

var query2 = (from contact in contacts
                         join callLog in callLogs on contact.Phone equals callLog.Number into joined
                         from callLog in joined.Where(p=>p.Incoming == false).DefaultIfEmpty()

                         select new
                         {
                             who = contact.FirstName + " " + contact.LastName + " " + contact.Phone,
                             how_many = callLog != null ? callLogs.Where(s =>s.Number == contact.Phone).Count() : 0
                         }).Select(p=>p).Distinct();
            foreach (var q in query2)
            {
                Console.WriteLine(q.who + " " + q.how_many);
            }

结果:

Tom XXXX 555-555-555 拨打 2 次​​p>

苏菲 YYYY 333-333-333 打了 3 次电话

Mark ZZZZ 111-111-111 调用 0 次

现在我只想选择传入 == true 的 callLog:

var query2 = (from contact in contacts
                         join callLog in callLogs.Where(p=>p.Incomming == true) on contact.Phone equals callLog.Number into joined
                         from callLog in joined.Where(p=>p.Incoming == false).DefaultIfEmpty()

                         select new
                         {
                             who = contact.FirstName + " " + contact.LastName + " " + contact.Phone,
                             how_many = callLog != null ? callLogs.Where(s =>s.Number == contact.Phone).Count() : 0
                         }).Select(p=>p).Distinct();
            foreach (var q in query2)
            {
                Console.WriteLine(q.who + " " + q.how_many);
            }

(查看新查询2中的第二行) 但结果是一样的:

Tom XXXX 555-555-555 拨打 2 次​​p>

苏菲 YYYY 333-333-333 打了 3 次电话

Mark ZZZZ 111-111-111 调用 0 次

我该如何解决?

【问题讨论】:

  • 看起来和你之前的问题很相似!
  • LINQ query2 from query 的可能重复项
  • 不!现在我正在使用leftjoin..我正在学习,它不好吗?

标签: c# sql linq


【解决方案1】:

试试这个:

  var query2 = (from contact in contacts
                                 join callLog in callLogs on contact.Phone equals callLog.Number into joined
                                 from callLog in joined.Where(p=>p.Incoming == true).DefaultIfEmpty()

                                 select new
                                 {
                                     who = contact.FirstName + " " + contact.LastName + " " + contact.Phone,
                                     how_many = callLog != null ? callLogs.Where(s =>s.Number == contact.Phone).Count() : 0
                                 }).Select(p=>p).Distinct();
foreach (var q in query2)
{
  Console.WriteLine(q.who + " " + q.how_many);
}

【讨论】:

  • 你有没有把 p=>p.Incoming == false 改成 p=>p.Incoming == true
  • 已解决...看看:how_many = callLog != null ?此处必须加入 callLog(...) 并在第二行将 callLogs 更改为 callLogs.Where(p=>p.Incoming == true),感谢您的帮助并为错误道歉:)
【解决方案2】:

查看问题而不是代码,我认为以下内容更好地表达了您正在尝试做的事情:

var contacts = new List<Contact>
{
    new Contact { FirstName = "Tom", LastName = "Jones", Phone = "555-555-555" },
    new Contact { FirstName = "Sophie", LastName = "Monk", Phone = "333-333-333" },
    new Contact { FirstName = "Mark", LastName = "Twain", Phone = "111-111-111" }
};

var callLogs = new List<CallLog>
{
    new CallLog { Number = "555-555-555", Incoming = true },
    new CallLog { Number = "555-555-555", Incoming = true },
    new CallLog { Number = "333-333-333", Incoming = true },
    new CallLog { Number = "333-333-333", Incoming = true },
    new CallLog { Number = "333-333-333", Incoming = true }
};

var data = contacts.Select(c => new 
    {
        who = string.Format("{0} {1} {2}", c.FirstName, c.LastName, c.Phone),
        how_many = callLogs.Count(l => l.Number == c.Phone && l.Incoming)
    }).ToList();

data.Dump();

}

public class Contact
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string State { get; set; }
}

public class CallLog
{
    public string Number { get; set; }
    public int Duration { get; set; }
    public bool Incoming { get; set; }
    public DateTime When { get; set; }

用 Linqpad 编写的示例,将其复制/粘贴到编辑器中,您应该会看到以下输出:

  • 谁有多少
  • 汤姆·琼斯 555-555-555 2
  • 苏菲·蒙克 333-333-333 3
  • 马克吐温 111-111-111 0

【讨论】:

  • 谢谢!我解决了我的问题(稍后我可以插入我的解决方案 - 10 小时......)但它太好了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多