其中所有List值都等于列List

本文关键字:List 于列 | 更新日期: 2023-09-27 17:51:19

你好,我有一个问题,我不能解决它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,选择所有的电影是动作和喜剧谢谢你花时间看这个,我将非常感谢你的帮助。对不起,我的英文不好,希望你能看得懂。

其中所有List值都等于列List

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