首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Linq c#的连接中的正则表达式?

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

Stack Overflow用户
提问于 2018-08-16 22:12:56
回答 2查看 386关注 0票数 1

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

例如:

学生表包含一个名为Subjects的字段,其中包含逗号分隔值,例如“Math,English,Science”。

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

我想对Subject表进行内连接,在Subject表中,Subject名称位于Student表的逗号分隔值中。在MySQL中:

代码语言:javascript
复制
SELECT st.* 
FROM Student st
INNER JOIN Subjects su ON st.Subjects REGEXP CONCAT('[[:<:]]', su.Name, '[[:>:]]')

因此,在MySQL中,这将为我提供所有在Subjects字段中具有匹配主题名称的学生。有没有可能在LINQ中做这样的连接?

我知道实际的问题是数据库设计,但这不是我能在匆忙中改变的。

谢谢,感谢您的帮助!

EN

回答 2

Stack Overflow用户

发布于 2018-08-16 23:15:11

我没带Regex就做到了。而是使用string.Split()方法

代码语言:javascript
复制
            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());
票数 0
EN

Stack Overflow用户

发布于 2018-08-18 01:55:42

在LINQ中,join只做等联接,所以如果你想在其他条件下联接,你必须自己用from...where来模拟联接。(注意:我怀疑这个查询是否会使用任何索引。)

代码语言:javascript
复制
var ans = from st in Student
          from su in Subjects
          where ("," + st.Subjects + ",").Contains("," + su.Name + ",")
          select new { st, su };

如果您知道可能的最大主题数量,您可以使用固定数量的案例来模拟Split,这可能会使用索引,但在这一点上,您可能更好地使用SQL语句或存储过程。

例如,对于最多4个主题:

代码语言:javascript
复制
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 };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51879144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档