根据多个字段从两个表中选择不同的行

时间:2019-08-02 13:38:45

标签: c# sql linq

我需要从一个表中选择其他表中不存在的行。但是,我无法加入ID,因为这些表来自不同的数据库。

在第一个数据库中,我有一个名为Actual的表: enter image description here

另一个数据库中的第二个表名为Forecastsenter image description here

我对每个数据库都有一个上下文,并使用以下C#代码获取数据:

var forecastRows = targetContext.Forecasts.ToList();
var actualRows = sourceContext.Actual.ToList()
    .Select(actual => new
    {
        TargetMonth = DateTimeExtensions.GetMonthCode(actual.Date.Year, actual.Date.Month),
        CustomerCode = actual.CustomerGroupNo,
        actual.Brand
    });

然后,我定义变量以从Forecasts表中获取行,而这些行在Actual表中不存在:

var orphanActualRows = forecastRows.Where(row => 
    !actualRows.Any(f => f.Brand == row.Brand.Code 
                      && f.CustomerCode == row.Customer.Code 
                      && f.TargetMonth == row.TargetMonth));

但是它不能正常工作。它返回Forecasts表的总数。但这是不准确的,因为行数要少得多...

1 个答案:

答案 0 :(得分:-1)

我认为这种加入可以为您提供帮助。

  var orpahanActualRows = targetContext.Forecast.Join(
            sourceContext.Actual,
            forecastRows => new { forecastRows.Brand, forecastRows.CustomerCode, forecastRows.TargetMonth },
            actualRows => new { actualRows.Brand, actualRows.CustomerGroupNo, actualRows.Date.Year, actualRows.Date.Month},
            (forecastRows, actualRows) => new { f = forecastRows,  rows=actualRows })
            .Where(d => d.rows.Brand.Code != d.f.Brand
                    && d.rows.CustomerCode != d.f.CustomerCode
                    && rows.TargetMonth != DateTimeExtensions.GetMonthCode(rows.Date.Year, rows.Date.Month))
            .Select(d => d.f)
            .ToList();