1

パフォーマンスの悪いコードがあり、.ToListを開始する前に、適切なwhere句を導入するためにコードを書き直す必要がありますが、それが行き詰まっています。

現在、コードはこれと同じように見えます(大まかに言って、表示しやすくするために検索条件の一部を削除しました)

var Widgets = from b in _caspEntities.Widgets.Include("WidgetRegionLogs")
                    .Include("WidgetStatusLogs").Include("WidgetVoltageTests")
                        select b;

IEnumerable<Widget> results = Widgets.ToList();
if (comboBoxRegion.SelectedValue.ToString() != "0")
{
    results = from b in results
              where b.CurrentRegionLog != null && b.CurrentRegionLog.RegionId == int.Parse(comboBoxRegion.SelectedValue.ToString())
              select b;
}

if (comboBoxStatus.SelectedValue != null)
{
    results = from b in results
              where b.CurrentStatusLog != null && b.CurrentStatusLog.StatusId == comboBoxStatus.SelectedValue.ToString()
              select b;
}

if (txtCode.Text.Trim().Length > 0)
{
    results = from b in results
              where b.CodeNumber == txtCode.Text.Trim()
              select b;
}

dataGridViewWidget.DataSource = results.ToList();

SQLを簡単に書くことができます。基本的にモデルは単純です。RegionLogとStatusLogの両方に履歴を格納するウィジェットがあります。現在のリージョンとステータスは、WidgetIDでグループ化し、最新の更新日を選択することでこれから取得されます(次に、リージョンテーブルとステータステーブルに移動して実際の値を取得します)。

ですから、これをLINQに変換する必要がありますが、正直なところ、私には手がかりはありませんが、ケンであり、学ぶ意欲があります。私の頭の中で、where句をいくつか追加し、where句を適用した後にWidget.toListを実行する必要があると思います。CurrentRegionLogとのCurrentStatusLog概念は、を実行するまで入力されないため、苦労していIEnumerableます。

誰かがいくつかのポインタを与えることができれば、私は感謝するでしょう、ありがとう

編集-追加

    public BatteryRegionLog CurrentRegionLog
    {
        get { return _currentRegionLog; }
    }

    private BatteryRegionLog _currentRegionLog
    {
        get
        {
            if (this.BatteryRegionLogs.Count > 0)
            {
                BatteryRegionLog log = this.BatteryRegionLogs.OrderByDescending(item =>    item.LastModifiedDate).First();
                return log;
            }
            else
            {
                return null;
            }
        }
    }
4

2 に答える 2

0

この行を削除してみてください:

IEnumerable<Widget> results = Widgets.ToList();

Widgets上部にある変数を使用するだけです

.ToList()データベースに移動し、すべてのデータをエンティティにマテリアライズします。

クエリを呼び出さない場合でも、クエリは句.ToList()に対して「オープン」ですwhere

于 2013-02-20T09:51:56.873 に答える
0

次のようにクエリを作成できます。

    if (comboBoxRegion.SelectedValue.ToString() != "0")
    {
        var id = int.Parse(comboBoxRegion.SelectedValue.ToString()
        Widgets = from b in Widgets
                  let currentRegionLog = 
                        b.BatteryRegionLogs
                         .OrderByDescending(item => item.LastModifiedDate)
                         .FirstOrDefault()
                  where currentRegionLog.RegionId == id)
                  select b;
    }
    ... // Same for the other criteria.

    dataGridViewWidget.DataSource = Widgets.ToList();

を実行する前に、クエリ全体が実行されるわけではありませんToList()。すべてがSQLに変換されるため、nullチェックは必要ありませんb.CurrentRegionLog != nullb.CurrentRegionLog.RegionId == idがない場合、SQLは問題なく評価されますCurrentRegionLog

編集

CurrentRegionLogはクラスの計算されたプロパティであるため、 WidgetSQLに変換できません。基本的なナビゲーションプロパティのみが使用されるように、計算されたプロパティのコードをクエリに組み込むように努めました。これにより、EFはそれをSQLに再度変換できます。

于 2013-02-20T09:53:19.380 に答える