使用LINQ将表中逗号分隔的字符串转换为不同的值集合

时间:2011-09-06 12:32:40

标签: c# linq

我正在研究这个MVC3 tutorial,并以逗号分隔的字符串输入电影类型。

在第6部分中,我们从表格中选择类型来填充下拉列表。

我想在下拉列表中填入一个独特的单一类型集合,但我无法让它工作。

这是教程建议的起点

var GenreLst = new List<string>();

var GenreQry = from d in db.Movies
                   orderby d.Genre
                   select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());

......这就是我要去的地方

var GenreLst = new List<string>();

var GenreQry = (from d in db.Movies
                orderby d.Genre
                select d.Genre ).Select(s=>s.Split(','))
                .Distinct();

GenreLst.AddRange( GenreQry );

2 个答案:

答案 0 :(得分:5)

Linq2Sql不知道s.Split(',')方法,所以它应该抛出异常,你可以这样做:

var GenreQry = (from d in db.Movies
             orderby d.Genre                 
             select d.Genre ).Distinct().ToList(); 

GenreLst.AddRange( GenreQry.SelectMany(x=>x.Split(',')).Distinct());

关于代码: 在查询结束时调用ToList()时,将获取您的数据并且您的查询实际上是列表, 在第二部分中,SelectMany平面将字符串分隔为IEnumberable of strings。

修改:在第一部分中,您可以拨打.AsEnumerable()而不是.ToList()来获取数据,这似乎更好。

答案 1 :(得分:1)

如果您发现SelectMany语法有点令人困惑,请考虑以下内容(编译成一个选择很多方法调用,但我觉得更容易阅读):

var GenreQry = (from d in db.Movies.AsEnumerable() 
                from s in d.Split(',')
                select s)
               .Distinct()
               .OrderBy(s => s);