繁体   English   中英

LINQ to SQL加入FirstOrDefault()的问题

[英]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)

将返回一个只有一个元素的延迟集合。

为什么不让你的查询更简单!!

  1. 我强烈建议在查询结束时使用FirstOrDefault() (查询的最后一个方法)。
  2. 把你的条件放在Where更好而不是FirstOrDefault因为你要把它放在最后

我认为你的错误是FirstOrDefault with join ,当你使用join时你应该加入一个集合而不是单个项目(single是FirstOrDefault的结果)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM