gpt4 book ai didi

c# - EF 条件连接或 WHERE IN

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:23 25 4
gpt4 key购买 nike

我正在将实现非常标准的搜索功能的存储过程转换为 Entity Framework 代码,但我不太确定如何完成这段 SQL 的工作:

SELECT 
*
FROM
MyTable a
WHERE
@parameter1 = 0 OR a.Id IN
(
SELECT ot.Id FROM OtherTable ot
WHERE ot.Id = @parameter1
AND (@parameter2 = 0 OR ot.OtherValue = @parameter2)
)

所以本质上,一些可选的搜索参数被传入,如果它们不为零,它们将被用作过滤器。相当标准。

在上述情况下,存在 M:1 关系,OtherTable 位于“多”方。

我看到了两个选项,但我似乎无法获得其中任何一个的正确语法:

(1) 我可以使用条件 Where 模拟 SP 中正在执行的操作 子句(Example Here)。我试过这样的事情:

.WhereIf(search.Id != 0, mytable => search.AttributeId == mytable.OtherTables)

对于@parameter2,这必须进一步过滤。但无论如何,mytable.OtherTables 是一个集合,因为它在“多”方面,所以我不能使用(例如)mytable.OtherTables.Id。

(2) 我可以将其转换为连接,但连接必须是有条件的(仅在@parameter1 != 0 时包括连接)。我不确定是否可以使用 L2S/EF 有条件地加入。

最佳答案

如何有条件地添加 Where 并仅将相关位发送到 SQL,而不是将所有内容都发送到 SQL 并尝试编写复杂的查询。

请记住,Linq 使用延迟执行,这使我们能够逐步构建查询,然后在准备就绪时执行。

IQueryable<MyTable> myTableQuery = context.MyTables.AsQueryable();

if (parameter1 != 0)
{
IQueryable<OtherTable> otherTableQuery = context.OtherTables.AsQueryable();

if (parameter2 != 0)
{
otherTableQuery = otherTableQuery.Where(ot => OtherValue = parameter2);
}

myTableQuery = myTableQuery.Where(mt => otherTableQuery.Any(ot => ot.Id = mt.Id));
}

return myTableQuery.ToList();

请原谅任何拼写错误,这是在浏览器中编写的。

关于c# - EF 条件连接或 WHERE IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17621978/

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