我早些时候发布了一个问题,但我现在已经缩小了问题范围,这是非常不同的东西。基本上,我有一个相当长的查询,旨在从数据库中选择值到自定义结构中(我将在下面展示),但是我在连接方面遇到了问题-特别是试图只选择连接的第一行。以下是我的查询:
IENumerable<VehicleDetails> list = (
from s in dc.Vehicles
join veh in dc.VehicleTypes
on s.VehicleType equals veh.ID into vg
from v in vg.DefaultIfEmpty()
join consignments in dc.Consignments
.FirstOrDefault(x => x.TripDate > dateFrom &&
x.TripDate < dateTo &&
x.DeliveryDepot == depot.Letter &&
(x.DeliveryStatus == 2 || x.DeliveryStatus == 3))
on new
{
Reg = s.VehicleReg,
Depot = s.VehicleDepot
} equals new
{
Reg = consignments.VehicleReg,
Depot = consignments.DeliveryDepot
} into con
from c in con.DefaultIfEmpty()
select new
{
VehicleType = (
s.VehicleType == null ? "?":
v.VehicleType1.ToString()),
TotalRate = c.Rate + c.AddCharges,
VehicleReg = (string.IsNullOrEmpty(c.VehicleReg) ?
c.Subcontractor: c.VehicleReg),
VehicleTypeName = (v.VehicleTypeDescription == null ?
"SubContractor": v.VehicleTypeDescription)
});
我的结构:
public struct VehicleDetails
{
internal string VehicleType;
internal decimal TotalRate;
internal string VehicleReg;
internal string VehicleTypeName;
}
对于第二个连接中的FirstOrDefault()
,我得到:中的一个表达式的类型连接子句不正确。类型呼叫组推理失败加入。
如果没有它(并用Where代替FirstOrDefault
),我就会得到一个关于将匿名类型转换为"车辆"类型的隐式错误。两个错误都发生在from c in con.DefaultIfEmpty()
呼叫上。
如果您有任何想法,我将不胜感激
FirstOrDefault()将急切地返回单个元素,但您需要的是元素的集合(IQueryable)。
dc.Consignments
.Where(x => x.TripDate > dateFrom &&
x.TripDate < dateTo &&
x.DeliveryDepot == depot.Letter &&
(x.DeliveryStatus == 2 || x.DeliveryStatus == 3))
.Take(1)
将返回一个只有一个元素的延迟集合。
为什么不让你的查询更简单呢?
- 我强烈建议在查询结束时使用
- 把你的条件放在
Where
而不是FirstOrDefault
,因为你要把它放在最后
FirstOrDefault()
(查询的最后一种方法)。我认为你的错误在这里是FirstOrDefault
与join
,当你使用连接时,你应该与一个集合而不是单个项目(单个是FirstOrDefault的结果)连接