0

こんにちは私は問題があり、3日間それを解決することができません。私はこことグーグルで多くの投稿を赤くしました、しかし私は解決策を見つけることができません。

dbには、列「Gener」があります-nvarchar(350)には、たとえば次のものが含まれています。

row 1: 1,4,32,11
row 2: 32,11
row 3: 1
row 4: 4,56,1,23
row 5: 4

チェックボックスリストから、この値をチェックします:1,4これはに追加されます

List<string> gnr = new List<string>();

私が欲しい結果は1行目と4行目です。

結果が行3と行4になるコードを作成しました(stackoverflowから取得)。

 var result = from m in db.Movies
              where gnr.Contains(m.Gener)
              select m;

そして、結果が行1、行3、行4、行5になるコード:

foreach (string term in gnr)
{
    var trb = db.movies.Where(o => o.Gener.Contains(term));
}

Ole DBを使用して作成することはできますが、LINQを使用すると、ここにコードを配置することはできません。

List<string> Gener = new List<string>();
Gener = Action,Comedy

StringBuilder builder = new StringBuilder();
string lastItem = Gener[Gener.Count - 1];

// Here I made string Which I'll add to cmd string
foreach (string safePrime in Gener)
{
    if (safePrime != lastItem)
    {
        builder.Append("((gener LIKE '%" + safePrime + "%')) AND").Append(" ");
    }
    else
    {
        builder.Append("((gener LIKE '%" + safePrime + "%')) ORDER By ID DESC").Append(" ");
    }
}

string dbSelect = builder.ToString();

//The result from loop
dbSelect = "((GenerLIKE '%Action%')) AND ((GenerLIKE '%Comedy%')) ORDER By ID"
//Add dbSelect to exist cmd
Cmd1.CommandText = "SELECT * FROM movies WHERE " + dbSelect;

そして、ここでの結果は、私がLINQで望んでいるものです。アクションとコメディであるすべての映画を選択してください。これを赤くしてくれてありがとう、私はいくつかの助けに非常に感謝します。私の英語で申し訳ありませんが、私はそれが読めることを願っています。

4

2 に答える 2

1

String.SplitEntity Framework では機能しないため、分割された Gener 列の値をメモリに移動できます。

var result = from m in db.movies.ToList()
             let movieGnr = m.Gener.Replace(" ", "").Split(',')
             where m.Gener != null && !gnr.Except(movieGnr).Any()
             select m;

行 1 と 4 を返します。

更新: 前述のように、このソリューションはすべてのムービー データをメモリに読み込みます。私がお勧めするのは、DB 構造を変更することです。各映画の Geners を含む MovieGeners テーブルを作成します。そして、Geners のリストを含む Movie にナビゲーション プロパティを追加します。このソリューションにより、すべてのクエリをデータベース側に移動できます。

int[] gnr;
var result = from m in db.movies.Include("Geners")                 
             where gnr.All(g => m.Geners.Any(x => x.Id == g))
             select m;
于 2013-01-11T21:05:26.590 に答える
0

以下で使用されるクエリは、行 1 と行 4 のデータを返します。where 句を使用して、行のデータ長を確認する必要があります。行 1 と行 4 のデータ長は 9 です。このクエリは機能します。

   var result= db.Movies.Where(mv => mv.Gener.Length > 8).Select(mv => mv.Gener);
于 2016-08-24T18:19:33.923 に答える