首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简化嵌套的foreach循环,其中包含一个lambda表达式的if语句

简化嵌套的foreach循环,其中包含一个lambda表达式的if语句
EN

Stack Overflow用户
提问于 2017-03-17 16:34:51
回答 3查看 593关注 0票数 0

正如标题所指定的那样,我有一个旅行列表--一次旅行有一张机票列表,每一张机票都连接到一个客户。

我想比较每个票务客户id和我的可变客户id,以便只获得该客户的机票,而且我也希望有一个该客户有机票的旅行列表。

代码语言:javascript
复制
   Customer customer = db.Customers.FirstOrDefault(u => u.UserId.Equals(user.Id));
   List<Ticket> Tickets = new List<Ticket>();
   List<Trip> Trips = new List<Trip>();

    foreach (Trip trip in db.Trips)
    {
        trip.Tickets.ForEach(ticket =>
            {
                if (ticket.Customer.UserId == customer.UserId)
                {
                    Tickets.Add(ticket); //Add the trip to Trips
                }
            }
        );
    }

我想要的代码,但不能让它起作用

代码语言:javascript
复制
    Trips = db.Trips.Select(trip => trip.Tickets.FirstOrDefault(ticket =>
        {
            if (ticket.Customer.UserId == customer.UserId)
            {
                Tickets.Add(ticket);
            }
        })).ToList();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-17 16:43:55

像下面这样的东西应该有效

代码语言:javascript
复制
List<Trip> trips = db.Trips.ToList();
List<Ticket> tickets = new List<Ticket>()
trips.ForEach(p => tickets.AddRange(p.Tickets.Where(q => q.Customer.UserId == customer.UserId)));

编辑--如果你想得到一张顾客的旅行清单,然后是一张机票清单,我会稍微换一种方式:

代码语言:javascript
复制
//get a list of customer trips
List<Trip> trips = db.Tickets.Where(p => p.Customer.UserId == customer.UserId).Select(q => q.Trip).ToList();
List<Ticket> tickets = trips.select(p => p.Tickets.Where(q => q.Customer.UserId == customer.UserId).ToList()).ToList();
//or if you're not bothered about hitting the db again:
//List<Ticket> tickets = db.Tickets.Where(p => p.Customer.UserId == customer.UserId).ToList();
票数 2
EN

Stack Overflow用户

发布于 2017-03-17 16:54:08

代码语言:javascript
复制
var tickets = db.Trips
    .SelectMany(trip => trip.Tickets)
    .Where(ticket => ticket.Customer.UserId == customer.UserId)
    .ToList();

像这样吗?

票数 1
EN

Stack Overflow用户

发布于 2017-03-17 17:22:07

要只获得,您的客户拥有的票:

代码语言:javascript
复制
List<Ticket> tickets = db.Tickets
                       .Where(t => t.Customer.UserId == customer.UserId)
                       .ToList();

要获得所有Trips,您的客户至少有一张票:

代码语言:javascript
复制
List<Trip> trips= db.Trips
                  .Where(t => t.Tickets.Any(ti => ti.Customer.UserId == customer.UserId))
                  .ToList();

不过,这是不会装船的。如果您也希望加载trips票证,只需添加如下所示的Include()

代码语言:javascript
复制
List<Trip> trips= db.Trips.Include("Tickets")
                  .Where(t => t.Tickets.Any(ti => ti.Customer.UserId == customer.UserId))
                  .ToList();

不需要查询Customer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42862754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档