您好我有问题,我无法解决它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行。
我已经(从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,选择所有动作和喜剧电影 感谢您抽出时间,我会非常感谢您的帮助。对不起我的英文我希望它是可读的。
答案 0 :(得分:1)
String.Split
不适用于Entity 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行。
更新:如上所述,此解决方案将所有电影数据加载到内存中。我建议你改变数据库结构 - 创建MovieGeners表,它将包含每部电影的Geners。并向Movie添加导航属性,其中包含Geners列表。此解决方案允许将所有查询移动到数据库端。
int[] gnr;
var result = from m in db.movies.Include("Geners")
where gnr.All(g => m.Geners.Any(x => x.Id == g))
select m;
答案 1 :(得分:0)
下面使用的查询将返回第1行和第4行数据。我们需要使用where子句并检查行数据长度。第1行和第4行数据长度为9.此查询可以正常工作。
var result= db.Movies.Where(mv => mv.Gener.Length > 8).Select(mv => mv.Gener);