如何解决如何使用具有某些ID的一列加入或搜索ID
我有两个表:
Student Conference
+----+------+ +----+-------+---------------+
| id | name | | id | name | ref_studentId |
+----+------+ +----+-------+---------------+
| 1 | jack | | 1 | Rose | 1,12 |
| 2 | kai | | 2 | White | 12 |
| 3 | wind | | 3 | Black | 1,12,12356 |
+----+------+ +----+-------+---------------+
我想将它们与studentid
一起加入,或在studentid
表中搜索conference
。
解决方法
我已经为您准备了一个小提琴-如果有任何问题可以随时提出。
顺便说一句:此解决方案可以解决您的问题。数据结构本身很丑陋,应该规范化。
void Main()
{
var students = new List<Student>
{
new Student { Id = 1,Name = "jack" },new Student { Id = 12,Name = "kai" },new Student { Id = 12356,Name = "wind" }
};
var conferences = new List<Conference>
{
new Conference { Id = 1,Name = "Rose",RefIds = "1,12" },new Conference { Id = 2,Name = "White",RefIds = "12" },new Conference { Id = 25,Name = "Black",12,12356" }
};
var result = students.Select(s => new Tuple<int,Conference[]>(s.Id,conferences.Where(c => c.RefIds.Split(",").Contains(s.Id.ToString())).ToArray()));
}
// Define other methods,classes and namespaces here
public class Student
{
public int Id {get; set;}
public string Name {get;set;}
}
public class Conference
{
public int Id {get; set;}
public string Name {get; set;}
public string RefIds {get; set;}
}
,
您可以使用LINQ Join
方法来实现所需的目标:
var result = dataContext.Students.Join(dataContext.Conferences,st => st.id,cf => cf.ref_studentId,(student,conference) => new { ... });
尽管我强烈建议使用实体框架Navigation Properties,使用它可以更轻松地完成上述操作:
var result = dataContext.Student.Include(st => st.conference);
更新:
请注意,除非您修复Conference
表设计(针对SQL Normalization Forms(特别是第一范式),否则您将无法执行上述LINQ查询,
每笔卖出均应为单值。
这意味着表列中的值不应以逗号(或其他任何字符)分隔。
要使上述查询有效,您必须使ref_studentId
仅包含StudentId
的单个值:
Conference
+----+--------+-----------+
| ID | Name | StudentId |
+----+--------+-----------+
| 1 | Rose | 1 |
| 2 | Rose | 12 |
| 3 | White | 12 |
| 4 | Black | 1 |
| 5 | Black | 12 |
| 6 | Black | 12356 |
+----+--------+-----------+
但是,老实说,这也将与SQL Normalization规则不匹配。
具体来说,2nd Normal Form表示:
所有属性(非键列)都应依赖于键。
还有4th Normal form,说:
不应存在多值依赖项(
Rose ⟶ 1
,Rose ⟶ 12
)
正确的解决方案是为Student⟶Conference关系创建另一个表。
Conference ConferencesStudents
+----+-------+ +----+--------------+-----------+
| ID | Name | | ID | ConferenceID | StudentId |
+----+-------+ +----+--------------+-----------+
| 1 | Rose | | 1 | 1 | 1 |
| 2 | White | | 2 | 1 | 12 |
| 3 | Black | | 3 | 2 | 12 |
+----+-------+ | 4 | 3 | 1 |
| 5 | 3 | 12 |
| 6 | 3 | 12356 |
+----+--------------+-----------+
现在,对于这一行,LINQ查询将是:
dataContext.ConferencesStudents.Join(dataContext.Students,cf => cf.ConferenceID,st => st.ID,(conferencesStudents,student) => new { conferencesStudents,student })
.Join(dataContext.Conferences,cfSt => cfSt.conferencesStudents.ConferenceID,cf => cf.ID,(cfSt,conference) =>
new
{
Student = cfSt.student,Conference = conference
});
注意:上面,我仅将Anonymous Types用于演示,我的强烈建议是改用真实的类Models。
OR
通过使用相同的Navigation Properties(如果您正确定义了EF关系),您可以拥有一个更简单的版本:
dataContext.ConferenceStudents.Include(cf => cf.Conferences)
.Include(cf => cf.Students)
更新2:
我不想这么说,但是有一种解决方法,以防万一您无法更改数据库设计:
var results = (
from c in dataContext.Conference.ToList() // populating all Conferences
from s in dataContext.Students.ToList() // populating all Students
where c.ref_studentId.Split(',').Contains(s.id.ToString())
select new
{
Student = s,Conference = c
}).ToList();
注意:从应用程序性能的角度来看,这将是无效的。
与上述方法相比,更好的选择是编写Stored Procedure并从EF调用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。