不要忘记阅读来自(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});
更新
@usr 完美地评论说Join
执行 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
});