選項1 - 使用包含:
var res = from m in db.messages
where m.id == message_id
from p in db.persons
where m.recipients.Split(",").Select(i => Int32.Parse(i))
.Contains(p.id)
select new Message() {
msg = m,
person = p
};
的想法:
- 獲取郵件作爲原始查詢
- 獲取其中包含在收件人列表中的所有人員
- 繼續與您原來的查詢
選項2 - 使用LINQ加入(也許複雜得多,它需要):
var res = from m in db.messages
where m.id == message_id
from r in m.recipients.Split(",")
select new {
Message = m,
Recipient = Int32.Parse(r)
} into rec
join p in db.persons on rec equals p.id
select new Message() {
msg = m,
person = p
};
的想法:
- 獲取郵件作爲原始查詢
- 斯普利特將該字符串轉換爲Int32列表
- 加入此列表對抗
db.persons
- 繼續您的o riginal查詢
不知道其中哪些是快,你必須檢查。
我也會迴避使用逗號分隔的字符串作爲外鍵參考,因爲您在這裏遇到了麻煩。他們看起來很醜陋,而且操縱真正的痛苦。相反,如果您可以控制架構,請考慮一個具有MessageId
和PersonId
的一對多關係表。當然,如果你沒有控制權,你就會陷入困境。
聲明:這些未經測試,因此可能需要對代碼進行一些調整才能使用。算法應該沒問題。
它無法完成。 http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/d2791ad4-3897-4fc0-80e9-72ebc4822898 – sean 2009-07-04 11:58:10
以下內容可能也是有用的信息,http://tomasp.net /blog/linq-expand.aspx – sean 2009-07-06 06:50:38