2013-10-10 58 views
22

我已经wriiten一个LINQ联接查询,我想取的值,如果其中一人是空的......LINQ的加入IQUERY,如何使用defaultifempty

代码:

var Details = 

UnitOfWork.FlightDetails 
      .Query() 
      .Join 
      (
       PassengersDetails, 
       x => x.Flightno, 
       y => y.FlightNo, 
       (x, y) => new 
       { 
        y.PassengerId, 
        y.classType, 
        x.Flightno, 
        x.FlightName, 
       } 
     ); 

我想使用类似..

"Above query".DefaultIfEmpty 
(
    new 
    { 
     y.PassengerId, 
     y.classType, 
     string.Empty, 
     string.Empty 
    } 
); 

“FlightDetails”是一类与“PassengerDetails” Idatarepository类型是IQueryable的局部变量的结果。如何获得乘客身份和乘客类型的结果,并且不包含整体结果中的航班号和航班名。

+0

我不知道,如果'DefaultIfEmpty()'将与匿名方法的工作。尝试定义一个类并使用它。 –

+0

您正在寻找已在其他问题中得到解答的“Left Outer Join”的语法。这里是方法/ Lambda LINQ语法的第一个:http://stackoverflow.com/questions/584820/how-do-you-perform-a-left-outer-join-using-linq-extension-methods – Ocelot20

回答

46

你基本上想做一个左外连接。您当前使用DefaultIfEmpty方法的方式是,如果整个列表为空,则提供一个默认条目。

您应该加入PassengerDetails,并且每个乘客详细信息列表如果为空,则调用默认值。这是一个左外相当于加入,它会有点像这样:

var data = from fd in FlightDetails 
      join pd in PassengersDetails on fd.Flightno equals pd.FlightNo into joinedT 
      from pd in joinedT.DefaultIfEmpty() 
      select new { 
         nr = fd.Flightno, 
         name = fd.FlightName, 
         passengerId = pd == null ? String.Empty : pd.PassengerId, 
         passengerType = pd == null ? String.Empty : pd.PassengerType 
         } 
+0

谢谢!它为我节省了很多时间。 –