选项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