gpt4 book ai didi

c# - 有条件地加入 LINQ

转载 作者:太空狗 更新时间:2023-10-30 00:42:37 25 4
gpt4 key购买 nike

我想创建一个与 Left Join 等效的 LINQ join 语句

我的表是这样设置的:

Recipe
RecipeID
...

Instruction
RecipeID
StepID
SomeFlag
...

等效的 SQL:

SELECT *
FROM Recipe r
LEFT JOIN Instruction i
ON r.RecipeID = i.RecipeID
AND SomeFlag > 0

这是我目前所拥有的:

var tmp = db.Recipe
.GroupJoin(
db.Instruction,
r => r.RecipeID,
i => i.RecipeID,
(r, i) => new {r, i},
???);

首先,GroupJoin 是否是此类操作的正确选择?据我了解,Join 相当于 SQL“Inner Join”而 GroupJoin 相当于“Left Join”。其次,获得我想要的结果的正确语法是什么?我已经搜索了一段时间,但似乎找不到合适的答案使用扩展方法

最佳答案

不要忘记阅读帮助(GroupJoin:MSDN http://msdn.microsoft.com/en-us/library/bb535047.aspxJoin MSDN http://msdn.microsoft.com/fr-fr/library/bb534675.aspx)

GroupJoinJoin 的最后一个参数是可选的(通过重载),通常不使用。它是一个允许您指定如何比较 r.RecipeIDi.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
});

关于c# - 有条件地加入 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com