GroupJoin
( : MSDN http://msdn.microsoft.com/en-us/library/bb535047.aspxおよびJoin
MSDN http://msdn.microsoft.com/fr-fr/library/bb534675のヘルプを読むことを忘れないでください。 .aspx )
GroupJoin
andの最後の引数はJoin
(オーバーロードによる) オプションであり、通常は使用されません。r.RecipeID
との比較方法を指定できる機能ですi.RecipeID
。RecipeID
整数でなければならないため、デフォルトの比較子を使用することをお勧めします。だからそれをしましょう:
var tmp = db.Recipe
.Join(db.Instruction,
r => r.RecipeID,
i => i.RecipeID,
(r, i) => new {r, i});
ここで必要なのは、SomeFlag > 0
. 入社前にやってみませんか?このような:
var tmp = db.Recipe
.Join(db.Instruction.Where(instruction => instruction.SomeFlag > 0),
r => r.RecipeID,
i => i.RecipeID,
(r, i) => new {r, i});
アップデート
Join
@usr は、INNER JOIN を実行すると完全にコメントしています。
お気づきかもしれませんが、LINQ には、INNER、OUTER、LEFT、RIGHT 結合の異なるメソッドはありません。特定の SQL 結合に相当する LINQ を知るには、MSDN ( http://msdn.microsoft.com/en-us/library/vstudio/bb397676.aspx )でヘルプを見つけることができます。
var tmp = from recipe in Recipes
join instruction in
from instruction in Instructions
where instruction.SomeFlag > 0
select instruction
on recipe.RecipeID equals instruction.RecipeID into gj
from instruction in gj.DefaultIfEmpty()
select new
{
recipe,
instruction
};
拡張メソッドを使用すると、少し醜い解決策になります:
var tmp = Recipes.GroupJoin(Instructions.Where(instruction => instruction.SomeFlag > 0),
recipe => recipe.RecipeID,
instruction => instruction.RecipeID,
(recipe, gj) => new { recipe, gj })
.SelectMany(@t => @t.gj.DefaultIfEmpty(),
(@t, instruction) => new
{
@t.recipe,
instruction
});