代码之家  ›  专栏  ›  技术社区  ›  Michael B

使用Linq c#?的联接中的正则表达式?

  •  0
  • Michael B  · 技术社区  · 8 年前

    例如:

    Student表包含一个名为Subjects的字段,该字段的值用逗号分隔,例如“math、English、Science”。

    我想对Subject表做一个内部联接,其中Subject名称在Student表中以逗号分隔的值表示。在MySQL中:

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

    所以在MySQL中,这应该给我所有在其Subjects字段中有匹配主题名的学生。可以在LINQ中进行这样的连接吗?

    我知道实际的问题是数据库设计,但这不是我可以马上改变的。

    2 回复  |  直到 8 年前
        1
  •  0
  •   jdweng    8 年前

    我是在没有Regex的情况下做的。改为使用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());
    
        2
  •  0
  •   NetMage    8 年前

    join 只有equi加入,所以如果你想在其他条件下加入,你必须用 from ... where

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

    如果你知道尽可能多的科目,你可以效仿。 Split

    例如,最多4名受试者:

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