我正在尝试使用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;
...无法推断出类型。
我怎样才能让它发挥作用?
答案 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