是否可以在使用linq的连接中使用正则表达式。
例如:
学生表包含一个名为Subjects的字段,其中包含逗号分隔值,例如“Math,English,Science”。
主题表包含每个主题的行,每个主题的名称字段中包含该主题。
我想对Subject表进行内连接,在Subject表中,Subject名称位于Student表的逗号分隔值中。在MySQL中:
SELECT st.*
FROM Student st
INNER JOIN Subjects su ON st.Subjects REGEXP CONCAT('[[:<:]]', su.Name, '[[:>:]]')因此,在MySQL中,这将为我提供所有在Subjects字段中具有匹配主题名称的学生。有没有可能在LINQ中做这样的连接?
我知道实际的问题是数据库设计,但这不是我能在匆忙中改变的。
谢谢,感谢您的帮助!
发布于 2018-08-16 23:15:11
我没带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());发布于 2018-08-18 01:55:42
在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语句或存储过程。
例如,对于最多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 };https://stackoverflow.com/questions/51879144
复制相似问题