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; }
}

次のようにスタンドのリストを取得できます。

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 に答える