使用Linq C#连接中的正则表达式?

时间:2018-08-16 14:12:56

标签: c# mysql entity-framework linq

是否可以在使用linq的联接中使用正则表达式。

例如:

Student表包含一个名为Subjects的字段,其值以逗号分隔,例如“ Maths,English,Science”。

主题表在名称字段中包含具有该主题的每个主题的行。

我想对“主题”表进行内部联接,其中“主题名称”在“学生”表中以逗号分隔。在MySQL中:

SELECT st.* 
FROM Student st
INNER JOIN Subjects su ON st.Subjects REGEXP CONCAT('[[:<:]]', su.Name, '[[:>:]]')

因此,在MySQL中,这应该给我所有在“主题”字段中具有匹配的“主题名称”的学生。可以在LINQ中进行这样的联接吗?

我知道实际的问题是数据库设计,但是我不能急忙更改。

谢谢,感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我没有使用正则表达式就做到了。而是使用string.Split()方法

            DataTable dt = new DataTable();

            dt.Columns.Add("Subjects", typeof(string));
            dt.Columns.Add("Index", typeof(int));

            dt.Rows.Add(new object[] { "Math,English,Science",1 });
            dt.Rows.Add(new object[] { "English,Science" ,2});
            dt.Rows.Add(new object[] { "French,Science" ,3});
            dt.Rows.Add(new object[] { "German,Science" ,4});
            dt.Rows.Add(new object[] { "English,Science" ,5});

            var groups = dt.AsEnumerable().Select(x => new { keys = x.Field<string>("Subjects").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), row = x }).ToArray();
            var rows = groups.Select(x => x.keys.Select(y => new { subject = y, row = x.row })).SelectMany(x => x).ToArray();

            Dictionary<string, List<DataRow>> subjectDict = rows.GroupBy(x => x.subject).ToDictionary(x => x.Key, y => y.Select(z => z.row).ToList());

答案 1 :(得分:0)

在LINQ中,join仅进行等联接,因此,如果要在其他条件下联接,则必须使用from ... where模拟联接。 (注意:我不确定此查询是否将使用任何索引。)

var ans = from st in Student
          from su in Subjects
          where ("," + st.Subjects + ",").Contains("," + su.Name + ",")
          select new { st, su };

如果您知道可能的最大主题数,则可以使用固定数量的案例模拟Split,并且可能使用索引,但是此时,最好使用SQL或存储过程。

例如,最多四个主题:

var ans2 = from st in Student
           let p1 = st.Subjects.IndexOf(",")
           let p2 = (p1 >= 0 ? st.Subjects.Substring(p1 + 1).IndexOf(",") : -1)
           let p3 = (p2 >= 0 ? st.Subjects.Substring(p2 + 1 + p1 + 1).IndexOf(",") : -1)
           let s1 = p1 >= 0 ? st.Subjects.Substring(0, p1) : st.Subjects
           let s2 = p2 >= 0 ? st.Subjects.Substring(p1 + 1, p2) : (p1 >= 0 ? st.Subjects.Substring(p1+1) : "")
           let s3 = p3 >= 0 ? st.Subjects.Substring(p2 + 1 + p1 + 1, p3) : (p2 >= 0 ? st.Subjects.Substring(p2+1+p1+1) : "")
           let s4 = p3 >= 0 ? st.Subjects.Substring(p3+1+p2+1+p1+1) : ""
           from su in Subjects
           where su.Name == s1 || su.Name == s2 || su.Name == s3 || su.Name == s4
           select new { st, su };