0

你好,我有一个问题,我不能解决它 3 天。我在这里和谷歌上发了很多帖子,但我找不到解决方案。

在 db 我有列“Gene” - nvarchar(350) 其中包含例如:

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

从 checkboxlist 我检查这个值: 1,4 添加到

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

我想要的结果是第 1 行和第 4 行。

我制作了(取自stackoverflow)代码,结果是第3行和第4行:

 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.Split不适用于实体框架,因此您可以在内存中移动拆分生成列值:

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 行。

更新:如上所述,此解决方案会将所有电影数据加载到内存中。我建议您更改数据库结构 - 创建 MovieGenes 表,其中将包含每部电影的 Geners。并将导航属性添加到将包含 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 回答