[英]Linq left join and where
i'm learning the book:
LINQ到使用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()。 此方法返回一個帶有聯系人和CallLogs的簡單List <>。
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次
蘇菲YYYY 333-333-333通話3次
標記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);
}
(請查看新query2的第二行),但結果相同:
Tom XXXX 555-555-555通話2次
蘇菲YYYY 333-333-333通話3次
標記ZZZZ 111-111-111通話0次
我該如何解決?
嘗試這個 :
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);
}
考慮問題而不是代碼,我認為以下內容可以更好地表達您要執行的操作:
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編寫的示例,直接將其復制/粘貼到編輯器中,您將看到以下輸出:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.