2013-01-11 78 views
0

你好,我有一个问题,我无法解决它3天。我已经在这里和谷歌红了很多帖子,但我无法找到解决方案。其中所有List值等于列表

在分贝我有列 “根儿” - 为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行。

我做了(取自计算器)代码,结果是第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

也许你的意思是** geNDer **。 – abatishchev

+0

为什么有些地方和其他地方的数字和逗号之间没有空格? – karaxuna

+0

我没有在数据库中的空间我的格式文本错误,当我写这...对不起 – Momchilov

回答

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

UPDATE:如上所述,该解决方案将加载所有的电影数据进入内存。我建议你改变数据库结构 - 创建MovieGeners表,它将包含每部电影的Gener。并将导航属性添加到将包含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; 
+0

我不知道如何非常感谢你,这是完美的,这是我的搜索。我希望你的答案和我的问题对某人有帮助! – Momchilov

+1

@Momchilov没问题。只需一个建议 - 创建表格“MovieGenres”,它将保存电影和流派ID。然后,您将能够在服务器端进行搜索,而无需将实体加载到内存中。是的,你可以接受答案:) –

+0

我会采纳你的建议,非常感谢:)现在我正在继续下一步。 – Momchilov

0

下面用到的查询会返回第1行和第4行data.We需要使用where子句并检查行数据的长度。行1和行4的数据长度为9.此查询将起作用。

var result= db.Movies.Where(mv => mv.Gener.Length > 8).Select(mv => mv.Gener); 
相关问题