【发布时间】:2014-07-07 21:24:47
【问题描述】:
i'm learning the book:
LINQ to Objects 使用 C# 4.0
好的,我的问题:
我有两个类:Contact 和 CallLog。它看起来像:
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..我正在学习,它不好吗?