其中所有List值等于列List

时间:2013-01-11 20:59:59

标签: c# .net linq list

您好我有问题,我无法解决它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,选择所有动作和喜剧电影 感谢您抽出时间,我会非常感谢您的帮助。对不起我的英文我希望它是可读的。

2 个答案:

答案 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);