从列表中删除除了不同列表中的值之外的所有内容

时间:2017-03-15 19:44:32

标签: c# asp.net-mvc

我有一个'旅行列表'包含该特定旅行的所有门票的列表。我也有实体客户只持有该客户的门票列表。

我想要实现的目标是让客户在他的所有门票上创建一个仅包含该客户门票的Trips列表。这将允许我通过该用户有票的旅行然后为该用户的票证循环该用户。

public class Trip
{
    [Key]
    public int Id { get; set; }
    public virtual List<Ticket> Tickets { get; set; }
}

public class Ticket
{
    public int Id { get; set; }
    public int SeatNumber { get; set; }

    public virtual Trip Trip { get; set; }

    public virtual Customer Customer { get; set; }
}

public class Customer
{
    public int Id { get; set; }
    public virtual List<Ticket> Tickets { get; set; }
}

我的想法是从客户门票清单中检索所有旅行并创建一个独特的旅行列表,然后循环通过门票,然后删除除客户拥有的所有门票(我无法真正获得删除部分) ),我没有完成解决方案:

Customer customer = db.Customers.FirstOrDefault(u => u.UserId.Equals(user.Id));
List<Trip> Trips = customer.Tickets.Select(u => u.Trip).Distinct().ToList();
Trips = Trips.ForEach(t=>t.Tickets.RemoveAll(u=>u.))

更新

旅行表包含所有旅行的所有旅行。

客户表包含该客户的所有门票。

我想创建一个仅包含指定用户票证的旅行列表。

当我立即检索行程列表时,它将包含所有票证。

2 个答案:

答案 0 :(得分:2)

如果您正在使用实体框架(并且我假设您基于标签和问题),则应禁用延迟加载。这将强制您在查询数据库时指定要检索的相关实体,因为数据大小不会导致意外命中。

一旦你这样做,你就可以只检索感兴趣的数据

var customer = db.Customers
    .Include(cust => cust.Tickets.Select(ticket => ticket.Trip))
    .SingleOrDefault(cust => cust.UserId == user.Id);

Include和内Selecet将确保您检索每张故障单上的故障单和相关联的旅程,但仅限于与该用户相关的旅程。

这是一件好事,好像你正在使用延迟加载如果有一个用户喜欢巡航的话会发生什么事情,所以他们在旅行中有许多票也有很多票。然后,对于每次旅行,您将从数据库中检索大量数据。在您的数据库数据量增长之前,您不会意识到存在问题。

要禁用延迟加载,请在DbContext类型的构造函数的主体中添加此内容。

this.Configuration.LazyLoadingEnabled = false;

修改

  

...你能给我一些能与我现在拥有的东西一起工作吗

Trips.ForEach(trip => trip.Tickets.RemoveAll(ticket => ticket.Customer.Id != user.Id));

虽然这可以为您节省另一组数据库,但请CustomerId添加Ticket实体。

Trips.ForEach(trip => trip.Tickets.RemoveAll(ticket => ticket.CustomerId != user.Id));
  • ForEach不会返回任何内容,只会迭代List<T>
  • RemoveAll返回一个int并修改实际的收集(即不会返回新的列表

答案 1 :(得分:0)

如果我理解你是否想要一份客户有票的所有旅行清单,你可以这样做:

Customer.Trips = Trips.Where((trip) => trip.Tickets.Any((ticket) => customer.Tickets.Contains(ticket)));