使用FirstOrDefault()的LINQ到SQL连接问题

本文关键字:SQL 连接 问题 LINQ FirstOrDefault 使用 | 更新日期: 2023-09-27 17:49:17

我早些时候发布了一个问题,但我现在已经缩小了问题范围,这是非常不同的东西。基本上,我有一个相当长的查询,旨在从数据库中选择值到自定义结构中(我将在下面展示),但是我在连接方面遇到了问题-特别是试图只选择连接的第一行。以下是我的查询:

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()的LINQ到SQL连接问题

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()(查询的最后一种方法)。
  1. 把你的条件放在Where而不是FirstOrDefault,因为你要把它放在最后

我认为你的错误在这里是FirstOrDefaultjoin,当你使用连接时,你应该与一个集合而不是单个项目(单个是FirstOrDefault的结果)连接