[英]LINQ to SQL Join issues with FirstOrDefault()
我之前发过一个问题,但我现在已经把问题缩小了,这是一个非常不同的问题。 基本上,我有一个相当长的查询,旨在从数据库中选择值到一个自定义结构(我将在下面显示),但我遇到加入问题 - paiculary试图只选择一个连接的第一行。 这是我的查询:
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()
,我得到:
join子句中某个表达式的类型不正确。 在对组加入的调用中类型推断失败。
没有它(并用Where替换FirstOrDefault
),我得到一个关于将匿名类型转换为'vehdetials'类型的错误。 这两个错误都发生from c in con.DefaultIfEmpty()
调用中的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)
将返回一个只有一个元素的延迟集合。
为什么不让你的查询更简单!!
FirstOrDefault()
(查询的最后一个方法)。 Where
更好而不是FirstOrDefault
因为你要把它放在最后 我认为你的错误是FirstOrDefault
with join
,当你使用join时你应该加入一个集合而不是单个项目(single是FirstOrDefault的结果)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.