我有一张这样的表
Student Exam p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12
-----------------------------------------------------------------------------------
100 unit1 89 56 59 28 48 38 0 0 0 0 0 0
100 unit2 89 56 59 0 0 0 0 0 0 0 0 0
100 unit3 89 56 59 28 48 38 0 0 0 0 0 0
100 unit4 89 56 59 28 48 0 0 0 0 0 0 0
另一张表
Exam Num_subjects
----------------------
unit1 6
unit2 3
unit3 6
unit4 5
现在我需要为unit1选择标记表中的前8列,因为unit1的主题数是6 ..如何动态地执行此操作... 考试是linq中的标记表的外键到sql的任何想法......
答案 0 :(得分:1)
如果你有一个基于列的设计,因为L2S不允许你手动实现(即new MyTable { Foo = row.Foo /* omit some }
你有点被打破。
如果您只是想要数据,您可以使用类似“dapper”的东西,但不会出现此问题,但您需要自己编写TSQL,即
var rows = conn.Query<MyTable>("select p1, p2, p3, p4, p5 from MyTable where Exam=@exam",
new { exam }).ToList();
但最终,我认为我更喜欢这里不同的数据库架构......
答案 1 :(得分:0)
如果这些表被规范化,则不需要动态查询。 (检查你的设计)
如果确实想要动态执行此操作,则需要一个处理查询选择部分的表达式树... here您可以找到有关a的更多详细信息可以为您处理表达式树生成的动态查询库(您可以提供类似“new(p1,p2,p3)”的字符串并将其转换为表达式树)
答案 2 :(得分:0)
在这里你不需要使用linq,你可以使用逻辑
现在只需获得类似于unit1 = 6的Num_Subject
DataTable dt = [whole_table];
int counter = Num_Subjects + 1; //7
string colName = "P" + counter.ToString(); //P7
while(dt.Columns.Contains(colName))
{
dt.Columns.Remove(colName);
colName = "P" + (++counter).ToString()
}
最后,我们得到一个表到P6列,其余列将被删除。