1

まず、この質問がこのフォーラムにとって基本的すぎることをお詫び申し上げます。私はこれに非常に慣れておらず、多くの基本に苦労していますが、頑張っています!

データベース内の列の 1 つを間接参照する WHERE 句を使用して LINQ to SQL クエリを作成したいという問題があります。たとえば、次のようなコードがあるとします。

var PLMatches = from PLMat in db1.PLAccountHeaders
              where PLMat.CompanyAlphaId.Equals(CoId)
              && dbField.Equals(Limit)
              select PLMat;

dbField は、データベース フィールドの名前を含む変数になります。そのため、dbField の値が「PLMat.ItemCode」の場合は喜んで消え、ItemCode が Limit の値と等しいレコードのすべてのインスタンスを返します。また、dbField の値が「PLMat.ItemName」の場合は喜んで消えて、 Limit の値と等しい ItemName を持つレコードのすべてのインスタンスを返します。

非常に具体的な問題に答えるために、これに関するいくつかの助けを本当に感謝しており、それが私の基本的な理解を深めてくれると確信しています.

どうもありがとう

4

2 に答える 2

0

別の方法 (動的 linq 以外) は、クエリを条件付きで作成することです。そのようです:

var PLMatches = from PLMat in db1.PLAccountHeaders
              where PLMat.CompanyAlphaId.Equals(CoId)
              select PLMat;
if (dbField == "ItemCode")
    PLMatches = PLMatches.Where(m => m.ItemCode == Limit);
else if (dbField == "ItemName")
    PLMatches = PLMatches.Where(m => m.ItemName == Limit);
else if (dbField == ...

コードは少し繰り返しのように見えますが、考えられる条件の数が多すぎない場合は、常にこの方法で行うことを好みます。利点は、第一に、コードの整合性チェックが実行時ではなくコンパイル時に行われること (動的 linq の場合と同様)、第二に、コードの内容が非常に明確であることです。(2 番目の利点は動的 linq にも当てはまりますが、コードで式を作成する 3 番目の選択肢にはあまり当てはまりません)。

遅延実行のため、この方法で linq クエリを作成できます。PLMatches = PLMatches.Where...クエリを変更するだけで、まだ何も実行されていません。

于 2012-09-16T18:55:38.373 に答える
0

あなたが求めていることがLINQで可能だとは思いませんが、ダイナミックLinqライブラリを使用できます。

ここにリンクがあります

zip をダウンロードして解凍し、ソリューションで参照するだけです。

次に、次のようなことができます。

// the "normal" LINQ way:
    var query = from x in ctx.People
                        where x.city == "Boston" && x.age > 18
                        orderby x.ID
                        select x;


// the Dynamic Linq way:
    var query = database.People
                        .Where("city = Boston AND age > 18")
                        .OrderBy("id")
                        .Select("New(Person as Name, Age)"); 
于 2012-09-16T11:10:27.403 に答える