【问题标题】:How to put 'all' condition inside of linq joins.(Sql query prepared)如何将“所有”条件放入 linq 连接中。(准备 SQL 查询)
【发布时间】:2019-07-19 23:50:21
【问题描述】:

我正在使用 Entity Framework Core 2 和 Postgresql

当我的字段为空时,我尝试接受所有数据,例如粘贴的 sql db 查询;

select  
    "All"."Market",
    alarms."CPersentage",
from "All
left JOIN "Alarms" as alarms 
on "All"."Market" = coalesce(alarms."Buy", "All"."Market") //if alarms."Buy" = null then equaility became true!

但我无法在“ef core”上准备这种条件均衡,我尝试过这个;

var result =(from firstALL in Db.All
            join alarm in Db.Alarms on
            new
            {
                BUY = firstALL.Market,
                Parity = firstALL.Parity
            } equals new
            {
                BUY = alarm.Buy?? firstALL.Market,    //Problem is here: The name 'firstALL' is not in scope on the right side of 'equals'
                Parity = alarm.Parity?? firstALL.Parity
            }
            into alarmg
            from alarmgi in alarmg.DefaultIfEmpty()
            select new
            {
                BUY = firstALL.Market,
                CPersentage = alarmgi.CPersentage
            });

总结:当左连接参数为空、空时,我正在尝试使相等为真。

但错误是:名称“firstALL”不在“equals”右侧的范围内

【问题讨论】:

  • 第一个查询中的 ** 令人惊讶地难以阅读。
  • 与其考虑合并,不如考虑您的评论。你想检查alarm?.Buynull还是等于all.Market
  • 我正在使用像 ISNULL 函数一样的合并。 postgresqltutorial.com/postgresql-isnull 如果alarm.Buy =null 那么我想替换all.market value
  • 您可以进行交叉连接from firstAll in Db.All from alarm in Db.Alarms 并将条件放入where。大多数现代数据库都足够聪明,可以创建一个执行正确连接的查询计划。
  • DefaultIfEmpty移到Where之后。

标签: c# linq lambda entity-framework-core


【解决方案1】:

根据@juharr 的回复,我认为它有效。

代码就像,

 var allResult = from firstALL in Db.All
            from alarm in Db.Alarms
            .Where(x => (x.Buy ?? firstALL.Market) == firstALL.Market
                    && (x.Parity ?? firstALL.Parity) == firstALL.Parity).DefaultIfEmpty()

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 2016-02-17
    • 2012-08-12
    • 2018-03-08
    • 2020-03-25
    • 2014-12-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多