Linq连接查询iquery,如何使用defaultifempty。

41

我已经编写了一个LINQ联接查询,如果其中一个值为空,我想要获取这些值...

代码:

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是一个类上的Idatarepository类型,而PassengerDetails是一个IQueryable局部变量结果。如何在不包括整体结果中的flightnoflightname的情况下获取具有PassengerId和Classtype的结果?


我不确定 DefaultIfEmpty() 是否适用于匿名方法。尝试定义一个类并使用它。 - Sam Leach
您正在寻找“左外连接”的语法,这个问题已经在其他问题中得到了回答。以下是使用Method/Lambda LINQ语法的顶级解决方案链接:https://dev59.com/mXRB5IYBdhLWcg3wkH9N - Ocelot20
1个回答

85

你基本上想要做一个左连接(left outer join),目前你正在使用DefaultIfEmpty方法的方式是如果整个列表为空,则提供单个默认条目。

你应该与PassengerDetails联接,并对每个旅客详细信息列表调用默认值(default if empty)。 这相当于左连接,大致如下:

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
                       }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接