是否可以在使用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中进行这样的联接吗?
我知道实际的问题是数据库设计,但是我不能急忙更改。
谢谢,感谢您的帮助!
答案 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 };