【问题标题】:C# LINQ Join Tables with Where [closed]C# LINQ 使用 Where [关闭] 连接表
【发布时间】:2020-06-09 19:48:59
【问题描述】:

我有一个带有 2 个表的实体对象:rest 和 rest_services

我想使用链式 LINQ 查询复制以下 SQL 查询(并将其放入十进制列表中)

SELECT a.rest_id
FROM rest a, rest_services b
WHERE a.rest_id = b.rest_id
AND a.manager_id = 500
AND b.channel = 5

我已经解决了各种 stackoverflow 问题

Join/Where with LINQ and Lambda

How to perform Join between multiple tables in LINQ lambda

我在非链式语法方面取得了一些成功,但我无法正确放置 WHERE 的第二部分

 var Hot =
                from h in db.rest
                join hs in db.rest_services on h.rest_id equals hs.rest_id
where h.manager_id == 523 && hs.channel== 5
                select h.rest_id

任何帮助表示赞赏

【问题讨论】:

  • Join + Where + Select。试一试,然后edit您的问题并分享您拥有的代码。
  • 谢谢队友。完成
  • where h.manager_id == 523 && x => hs.channel== 5 ← 将其放在join 之后并完全删除.Where(...。应该是这样,除非您不想投影输出,在这种情况下,select h.rest_id 而不是您现在拥有的select
  • 这是我的错,因为我没有真正查看我从您的尝试中复制的代码:已修复:where h.manager_id == 523 && hs.channel== 5
  • var myListOfDecimals = Hot.ToList();

标签: c# linq join


【解决方案1】:

由于您只对从“rest”输出数据感兴趣,因此您所追求的性能更高的 SQL 版本应该是:

select  a.rest_id
from    rest a
where   a.manager_id = 500 
and     exists (
            select  0
            from    rest_services b
            where   a.rest_id = b.rest_id
            and     b.channel = 5
        )

而且,使用“链”语法并输出十进制列表,我相信这可以转换为:

db.rest.Where(r => 
    r.manager_id == 500 && 
    db.rest_services.Any(
        rs => rs.channel == 5 && r.rest_id == rs.rest_id
    )
).Select(r => Convert.ToDecimal(r.rest_id))
.ToList();

【讨论】:

  • Select 出现错误:bool 不包含 Select 的定义
  • @panosplat,只是我把括号弄错了。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多