gpt4 book ai didi

asp.net mvc Linq 从另一个表中排除值

转载 作者:行者123 更新时间:2023-12-04 05:30:09 25 4
gpt4 key购买 nike

我有一个展览场景。

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

在 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()
});

但这没有用。

UPDATE



这似乎有效 - 但我不是专家,所以如果它是最佳实践方式,我将不胜感激?
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()
});

感谢您的帮助?

马克

最佳答案

使用 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()来自 Stands.ToList().Where() .通过执行 ToList()之前 Where()您正在从数据库中取回所有行,然后在内存中处理它们。此 可以 非常昂贵。如果您执行 Stands.Where(...)那么您的过滤将在 sql 中完成,并且只会返回您想要的行。

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

关于asp.net mvc Linq 从另一个表中排除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com