你好,我有一个问题,我不能解决它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,选择所有的电影是动作和喜剧谢谢你花时间看这个,我将非常感谢你的帮助。对不起,我的英文不好,希望你能看得懂。
String.Split
不能与实体框架一起工作,因此您可以在内存中移动拆分generer列值:
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行。
UPDATE:如上所述,此解决方案将加载所有电影数据到内存中。我建议你改变DB结构-创建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行和第4行数据。我们需要使用where子句并检查行数据长度。第1行和第4行数据长度为9。这个查询可以工作。
var result= db.Movies.Where(mv => mv.Gener.Length > 8).Select(mv => mv.Gener);