2011-04-06 102 views
3

我之前发布了一个问题,但现在我已经缩小了问题范围,这是非常不同的。基本上,我有一个相当长的查询,旨在从数据库选择值到一个自定义结构(我将在下面显示),但我遇到了连接问题 - paticulary试图只选择连接的第一行。这里是我的查询:LINQ to SQL使用FirstOrDefault()加入问题

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()第二加入,我得到:

在 类型的表达式之一的加盟子句是不正确的。在呼叫组 加入时,输入 推断失败。

没有它(并与更换FirstOrDefault一凡代替),我得到含蓄错误转换的anonymoustype成“vehicledetials”类型。这两个错误都发生在from c in con.DefaultIfEmpty()调用中。

任何想法将是非常,非常感激

+1

请将您的代码缩减为代码问题。在目前的状态下,没有人会弄清楚并回答你的问题。 – Steven 2011-04-06 15:35:43

回答

9

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

这是如何处理默认的? – ametren 2013-04-19 20:39:56

0

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

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

我觉得这里的错误是FirstOrDefaultjoin,使用时加入,你应该用一个连接你就像收集不是单个项目(单个是FirstOrDefault的结果)