オプション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
- riginalクエリ
高速ですこれらのどの、あなたがチェックする必要がありますわかりません。
私はまた、外部キーリファレンスとしてカンマ区切り文字列を使用することを恥ずかしく思っています。つまり、ここで問題が発生しているためです。彼らは見ることが醜く、操作する真の痛みです。代わりに、スキーマを制御できる場合は、MessageId
とPersonId
の1対多の関係表を検討してください。もちろん、あなたがコントロールを持っていなければ、あなたは立ち往生しています。
免責事項:これらはテストされていないため、コードを動作させるためには微調整が必要な場合があります。しかしアルゴリズムは大丈夫です。
できません。 http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/d2791ad4-3897-4fc0-80e9-72ebc4822898 – sean
以下は有用な情報でもあります。http://tomasp.net /blog/linq-expand.aspx – sean