1

私のケースの説明: 私の C# および LINQ to SQL アプリケーションでは、FeserWard.Controls Intellibox を実装しています。携帯電話の販売の場合、ユーザーは携帯電話の IMEI を intellibox に入力し、ボックスは Table Handphone で検索を行ってユーザー入力 IMEI を探し、最後に正確に一致する IMEI レコードを表示します。

問題:すべての (Handphone.IMEI) を status=Available (Item.I_Status="Available") で除外したいのですが、そこからユーザーが IMEI を入力すると、インテリボックス リストは利用可能な IMEI からのみ検索を行います。

SQL

    select h.HP_ID, h.IMEI, h.Colour, i.I_Status
    from Item i, Handphone h
    where i.I_ID = h.HP_ID AND i.I_Status='Available'

IEnumerable DoSearch の LINQ をこれに置き換えたいのですが、行き詰まりました。

    var availableIMEISearch = from i in dataContext.Items.ToList()
                              join h in dataContext.Handphones.ToList()
                              on i.I_ID equals h.HP_ID
                              where(h.IMEI.StartsWith(searchTerm, StringComparison.OrdinalIgnoreCase)) && (i.I_Status=="Available")
                              select new { i, h };
    return availableIMEISearch;

現在実行可能な方法: IEnumerable DoSearch

    DataClasses1DataContext dataContext = new DataClasses1DataContext();
    public IEnumerable DoSearch(string searchTerm, int maxResults, object extraInfo)
    {
        var imeiSearch = dataContext.Handphones.ToList()
        .Where(h => h.IMEI.StartsWith(searchTerm, StringComparison.OrdinalIgnoreCase));
        return imeiSearch;
    }

表1:

Item (PK = I_ID)

表 2:

Handphone (PK,FK1 = HP_ID), where Item.I_ID = Handphone.HP_ID
4

1 に答える 1

1

Joh Skeet(A SO Hero) が述べたように、ToListクエリの実行を促し、完全なテーブル データをクライアント サイトに結合するクライアントにフェッチするため、クエリで使用しないでください。DB側でjoinを行うため、Linqにjoinでクエリ式を生成させ、DBに送信させて実行を遅らせる。副作用が少ない。

searchterm の大文字と小文字を区別する検索が必要かどうかについては言及されていませんでしたが、区別しない方がはるかに便利だと思いますので、削除してStringComparisonください。

携帯電話の情報のみが必要なのでi、選択した用語から除外することをお勧めします。使用するもののみを選択してください。

そして、ToListデータを取得するために結果を返す最後の追加。

新しいクエリは次のとおりです。

     var availableIMEISearch = from i in dataContext.Items
                          join h in dataContext.Handphones
                          on i.I_ID equals h.HP_ID
                          where(h.IMEI.StartsWith(searchTerm) && (i.I_Status=="Available")
                          select h;
return availableIMEISearch.ToList();

それでも解決しない場合。

  1. 結合条件を使用して両方のテーブルにデータがあることを確認します。

  2. SSMS を開き、SQL Server プロファイラーを実行して、生成されたクエリを確認します。そのクエリを手動で実行して、データがフェッチされているかどうかを確認してください。

于 2013-10-17T06:24:30.440 に答える