web-dev-qa-db-ja.com

文字列からLINQクエリを作成するにはどうすればよいですか?

私はLINQを初めて使用するので、コーディングについて本当に助けが必要です。

現時点では、文字列と変数変数があります。

string temp = "from product in myEntities.Products where product.Name.Contains(_Name) select product";
var _Products = temp;
LvProducts.DataSource = _Products;
LvProducts.DataBind();

基本的に、私がやりたいのは、事前に文字列に割り当てることで、カスタム/複雑なLINQクエリを作成できるようにすることです。作成が完了したら、文字列をvar変数に割り当てます。ただし、これは明らかに機能しません。したがって、誰かがこれについて私を助けることができますか?

11
Sammm

いくつかのオプションがあります。

  • Dynamic Linq ライブラリを使用して、その場でクエリを作成します。始めるのに最適な場所は、 ScottGuのブログエントリ を読むことです。ただし、これらのライブラリは、例のcontainsメソッドをサポートしていないと思います。 ここ は、このサポートを追加する方法を説明するブログ投稿です。

  • 直接SQLステートメントを実行します。 Linq to Sql または Linq to Entities のMSDNドキュメントを確認してください。

    var _Products = myEntities.ExecuteStoreQuery<Product>
    (@"SELECT * FROM Products WHERE [Name] In ('Item1', 'Item2')");
    
  • Linqの構成可能な動作を使用します。これは最も洗練されたソリューションではないかもしれませんが、選択肢が多すぎない場合は非常にうまく機能します。複数の部分でクエリを作成できます。

    var _Products = from product in myEntities.Products
                    select product
    
    _Products = from product in _Products 
                where product.Name.Contains(_Name)
                select product
    
    if FilterByPrice {
        _Products = from product in _Products 
                    where product.Price > 100 
                    select product
    }
    
18
Geoff Appleford

CodeDomProviderを使用していくつかのc#内でこのLinqをコンパイルすることでこれを行うことができます- 。NETアプリケーションにスクリプト機能を追加する -しかし、これは解決策としてかなり重いです。これを行う方法について詳しく知りたい場合は、LinqPadをご覧ください http://www.linqpad.net -作者は、逆コンパイラーを使用して、それがどのように機能するかを確認することを勧めています。

要件が単純なwhere句にすぎない場合は、Dynamic Linqを使用することもできます-ScottGuの投稿とMicrosoftのサンプルコードを参照してください--- http://weblogs.asp.net/scottgu/archive/2008 /01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

8
Stuart

多分これはあなたを助けることができます http://nlinq.codeplex.com/

BR。

3
eka808

そもそもLINQを使用する理由の多くは、コンパイル時にエラーを検出するコンパイラ検証済みクエリを取得するためです。文字列は実行時に解析されるため、これはその目的を無効にします。

ニーズに応じて、2つのオプションがあります。

1)eSQLクエリを作成し、それをObjectContextで実行します。これを使用すると、myEntities.Productsなどのエンティティを引き続き使用して、製品のリストを返すことができます。

2)通常のSQLクエリを使用し、ObjectContextを使用して、基になるデータベースに直接呼び出します。

0

私の推測では、動的なコード実行を使用する必要があります。詳細については、Ricksの投稿 west-wind をご覧ください。

0
fjdumont