13

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

現時点では、string 変数と var 変数があります。

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

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

4

6 に答える 6

21

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

  • 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
    }
    
于 2011-02-28T09:22:57.707 に答える
8

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

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

于 2011-02-28T08:05:21.070 に答える
3

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

BR。

于 2011-02-28T10:20:08.017 に答える
0

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

于 2011-02-28T08:11:12.350 に答える
0

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

必要に応じて、次の 2 つのオプションがあります。

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

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

于 2011-02-28T08:06:46.317 に答える
-3

ステートメントを文字列として作成し、それを SQL ステートメントとして解析する動的 SQL のように考えています。

あなたはすでにコードの中にいるので、そこでステートメントを作成してみませんか。従来の linq の代わりに Lambda を使用すると、はるかに簡単になります。私の2セント。

于 2011-02-28T08:04:55.550 に答える