0

少し誤解があります。解決していただけると幸いです。リクエストというテーブルがあります。

クエリを実行したいのですが、リクエスト ID で言いますが、うまくいきません。

public Requests SearchById(int id)
{
    Model.ModelContainer cont = new Model.ModelContainer();
    return (cont.Requests.Where(req => req.ReqId == id));
    //when i try to cast to Request i get an error too
}

この行が機能する例を見つけました:

cont.Requests.First(req => req.ReqId == id)

しかし、コンパイル中にラムダ式を含めることができないというエラーが発生します。

いくつか質問があります:

  1. 上の例をどのように処理できますか?(エンティティからのクエリ)
  2. リストに変換する以外に、複数行の結果を操作するにはどうすればよいですか
  3. 私は高度な検索を構築する必要があります(私は6-7列を持っています)、それを行う一般的な方法はありますか?

ありがとう !!

4

2 に答える 2

1

あなたの問題はWhere、オブジェクトのコレクション(ゼロから多数)を返すことです。必要なオブジェクトは 1 つだけです。オブジェクトのコレクションを単一のオブジェクトに単純にキャストすることはできません。

代わりに、 を取得する必要がありFirstます (または、 を呼び出すことができるのは 1 つだけであることが確実にわかっている場合Single)。

2について - それはあなたが何をしたいかによって異なります。foreach結果セットを上書きするか、リストに入れる前に結果セットから選択することができますが、最も効率的なオプションは最初にリストに入れることです。

そしてポイント3、柄が豊富。繰り返しますが、それはあなたが何をしているのか、そして「検索用語」がどのように機能するかによって異なります. 例えば、

public List<Requests> SearchById(int? id, DateTime? date, string name)
{
    var cont = new Model.ModelContainer();
    var query = cont.Requests;

    if (id != null)
        query = query.Where(req => req.ReqId == id.Value);

    if (date != null)
        query = query.Where(req => req.Date == date.Value);

    if (!String.IsNullOrEmpty(name))
        query = query.Where(req => req.Name == name);

    return query.ToList();
}
于 2011-05-06T02:40:01.643 に答える
1

これはうまくいくはずです:

public Request SearchById(int id)
        {
           using(Model.ModelContainer cont = new Model.ModelContainer())
           {
                return cont.Requests.Where(req => req.ReqId == id).FirstOrDefault();
           }
        }

あなたが持っていたのはIEnumerable<Request>、単一の要求ではなく、. また、あなたが持っていることを確認してください

using System.Linq;

あなたのコードファイルで。usingまた、ブロックを使用できる場合は、常にコンテキストを破棄してください。

cont.Requests.First(req => req.ReqId == id)

これも機能するはずです-using System.Linqコードファイルに があることを確認してください。

リストに変換する以外に、複数行の結果を操作するにはどうすればよいですか

コンテキストはローカルであり、メソッドの外では使用できないため (後で破棄されます)、リストが最適なオプションです。それをそのままにしておくと、IQueryableまだDBから結果を実際に取得していない場合、クエリを定義しただけです.DBクエリが実行されるだけなので、結果がコンシューマによって取得されるときに問題が発生しますが、対応するDB コンテキストは既に破棄されている可能性があります。.ToList()クエリの最後に追加して、IQuerable<T>

高度な検索を作成する必要があります (6 ~ 7 列あります)。一般的な方法はありますか?

.Where() 拡張メソッドで複数の句を組み合わせることができますWhere( x=> x.A=="foo" && x.B == 42)Where()必要に応じて、複数のメソッドをチェーンすることもできます。

于 2011-05-06T02:19:32.763 に答える