4

次のselect sqlクエリのLINQクエリを作成する方法:

string brandid="1,2,3"
string bodystyleid="1,2,3"
-------------------
-----------------

select * from car
where brandid in (brandid)
and bodystyleid in (brandid)
----------------------
-------------------

私の特定の要件は、brandid または bodystyleid が空白の場合 (ユーザーが特定の検索オプションのチェックボックスを選択しない場合)、クエリはその特定の where 条件のすべてのレコードを返す必要があることです。

私を案内してください。

ありがとう、

ポール

4

4 に答える 4

6

何も指定されていない場合にすべてのアイテムを返すという要件を満たすには、リストが空であることを確認する必要があります。

var brands = brandid.Split(',').Select(x => Int32.Parse(x));
var styles = bodystyleid.Split(',').Select(x => Int32.Parse(x));

var result = from c in car
             where (!brands.Any() || brands.Contains(c.brandid))
                  && (!styles.Any() || styles.Contains(c.bodystyleid))
             select c;

(sgmooreのソリューションに似ていますが、ブランド/スタイルが指定されていないかどうかのチェックが含まれています)

これがどのようにSQLに変換されるかを実際に確認していません。フラグを使用して、値があるかどうかを示す方が効率的かもしれません。

var brands = ....;   // As above
bool anyBrands = brands.Any()
var result = from c in car
             where (!anyBrands || brands.Contains(c.brandid))
               .....
于 2012-05-24T18:07:16.183 に答える
2

bodystyleidはbrandidまたはbodystyleidをチェックするためのものですか?(私はbodystyleidを想定していますが、質問(brandid)のクエリと一致するようにクエリを作成しました)

まず、次のことができます。

var results = (from c in car
               where c.brandid.Contains(brandid)
               && c.bodystyleid.Contains(brandid)
               select c).ToList();
于 2012-05-24T17:37:45.793 に答える
2
var brandids     = brandid    .Split(',').Select(n => int.Parse(n)).ToList();
var bodyStyleids = bodystyleid.Split(',').Select(n => int.Parse(n)).ToList();


var results =
    (from c in car where 
      brandids.Contains(c.brandid) && 
      bodyStyleids.Contains(c.bodystyleid) 
     select c
   ).ToList();
于 2012-05-24T17:52:05.077 に答える
0

あなたが持っているs はコンマ区切り文字付きの文字列です。テーブルの sと同じタイプのIdコレクションである必要があるため、列がである必要がある場合は、次のことができますListIdCarbrandidintbrandidsList<long>

var results = (
    from c in cars
    where brandids.Contains(c.brandid) && bodystyleid.Contains(c.bodystyleid) 
    select c).ToList();
于 2012-05-24T17:50:18.580 に答える