GroupJoin,SelectMany,GroupBy和Sum

时间:2018-02-27 17:25:29

标签: c# entity-framework linq entity-framework-6

我正在尝试使用GroupJoin和SelectMany在linq中执行'left outer join',但是我还想使用GroupBy和Sum聚合结果。

但是当我执行下面的代码时,我得到了:

  

System.NotSupportedException:'实体或复杂类型'... tableB'不能在LINQ to Entities查询中构造。'

Repo<tableA>().All()
    .Where(i =>
        (i.Date >= dateF && i.Date <= dateT)
        &&
        i.EndOfMonth
    )
    .GroupJoin(
        Repo<tableB>().All().Where(i => (i.fieldX = ...somevalue... )), 
        dt => dt.DayIndex, scd => scd.DayIndex, (dt, scd) =>
            new {
                dt = dt,
                scd = scd,
            }
    )
    .SelectMany(
        jn => jn.scd.DefaultIfEmpty( new tableB { Count1 = 0, Count2 = 0 }), // runtime error here
        (dt,scd) => new { dt=dt.dt, scd = scd}
        )
    .GroupBy(i => i.dt)
    .Select(i => new CountListItem
    {
        Date = i.Key.Date,
        CountField1 = i.Sum(o => o.scd.Count1),
        CountField2 = i.Sum(p => p.scd.Count2)
     })
     .OrderBy(i => i.Date)
     .ToList()

当我做DefaultIfEmpty()时,我收到错误:

  

System.InvalidOperationException:'转换为值类型'System.Int32'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。'

我假设,我必须承认,这是因为Sum遇到空值。

我尝试i.Sum(o => o.scd.Count1 ?? 0,但后来说:

  

运营商'??'不能应用于'int'和'int'类型的操作数[sic]

我也试过DefaultIfEmpty(new { Count1 = 0, Count2 =0}),但这给了我&gt;

  

...无法推断出类型。

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

避免第一个异常很简单 - 只需使用带有无参数import { geoJSON } from 'leaflet'; import * as geojson from 'geojson'; geoJSON(<geojson.Point>{ type: "Point", coordinates: [lng, lat] // Note that in GeoJSON, order is [LONG, LAT] }); 左外连接的标准模式。

第二个问题源于SQL和LINQ(C#)查询数据类型之间的差异。 SQL查询原生支持DefaultIfEmpty()值,即使源表达式不可为空,也可以返回NULL。正如您在上次尝试中注意到的那样,LINQ(特别是C#编译器)对该语法不满意。

诀窍是使用C#强制转换操作符将非可空类型提升为可空,然后然后将null-coalescing运算符应用于结果表达式:

NULL