使用linq to sql动态选择(number of)列

时间:2011-06-30 08:57:48

标签: c# asp.net linq linq-to-sql

我有一张这样的表

    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的任何想法......

3 个答案:

答案 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列,其余列将被删除。