2

我有一个展览场景。

如何从我将在参展商视图中显示的下拉列表中排除下面的可用展位列表。

在 Sql 中,我会:

Select StandID, Description from Stand 
Where StandID not in (Select StandID from Exhibitor)

参展商注册 - 并根据以下型号从下拉列表(StandID/Stand)中选择他们想要的展位:

 public class Exhibitor
{
    public int ExhibitorID { get; set; }
    public string CompanyName { get; set; }
    public string ContactName { get; set; }
    public int StandID { get; set; }
    public virtual Stand Stand { get; set; }
 }

展台型号如下:

  public class Stand
{
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
}

我可以得到一个 Stands 列表,如下所示:

var stands = db.Stands.ToList().Where(s => s.Booked==false)
          .Select(s => new SelectListItem
          {
              Value = s.StandID.ToString(),
              Text = s.StandNumber + ": " + s.Description + ": " + s.Size + ": £" + s.Rate.ToString()
          });

但是如何从展位列表中排除(从参展商中选择展位 ID)?

我试过:

var booked = db.Exhibitors.Select(s => new { s.StandID }).ToList();

然后使用:

var stands = db.Stands.ToList().Where(s => s.Booked==false)
          .Except(booked)
          .Select(s => new SelectListItem
          {
              Value = s.StandID.ToString(),
              Text = s.StandNumber + ": " + s.Description + ": " + s.Size + ": £" + s.Rate.ToString()
          });

但这没有用。

更新

这似乎可行 - 但我不是专家,所以如果它是最佳实践方式,我会很感激任何建议?

var stands = db.Stands.ToList().Where(s => !db.Exhibitors
.Any(bk => bk.StandID == s.StandID) && s.Booked == false)
          .Select(s => new SelectListItem
          {
              Value = s.StandID.ToString(),
              Text = s.StandNumber + ": " + s.Description + ": " + s.Size + ": £" + s.Rate.ToString()
          });

谢谢你的帮助?

标记

4

2 回答 2

3

使用 Linq Contains() 方法

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.contains.aspx

var booked = db.Exhibitors.Select(s => s.StandID).ToList();
var stand = db.Stands.Where(s=>s.Booked == false 
                                       && !booked.Contains(s.StandId)
              .Select(s => new SelectListItem
              {
                  Value = s.StandID.ToString(),
                  Text = s.StandNumber + ": " + s.Description + ": " + s.Size + ": £" + s.Rate.ToString()
              });

我看到您也更新了有关最佳实践的问题。可以对您的技术进行很多优化。IEnumerable首先,阅读和之间的区别IQueryable

具体来说,您应该删除ToList()from Stands.ToList().Where()。通过在从数据库中取回所有行ToList()之前执行,然后在内存中处理它们。Where()可能非常昂贵。如果您执行Stands.Where(...),那么您的过滤将在 sql 中完成,并且只会返回您想要的行。

通常,将您的 ToList() 保存为最后一步,并主动决定是否需要构建列表。

于 2012-10-04T20:28:11.457 回答
0

理想的方法始终是创建一个您想要作为输出的模型,将输出映射到该模型并返回它。这也将帮助客户端获得一个明确的模型来坚持和实施。

LINQ 中的复杂选择查询也是动态生成的,这比预编译的结构良好的存储过程需要更多时间。如果您期望更快的响应,请考虑这一点。

于 2015-03-14T18:06:34.720 回答