2010-01-07 51 views
1

我有多个SQL Server表通常是这样工作的:如何将多个数据库列存储到一个数组与LINQ2SQL

int id_this, int id_that, ..., double Value1, double Value2, ..., double Value96 

我知道这很烂,但我不能改变它。我想现在要做的是定义像

public class Foo 
{ 
    public int Id_This { get; set; } 
    public int Id_That { get; set; } 
    ... 
    public double Value[]; 
} 

价值阵是当然的属性一些类,但我觉得你的想法。

问题是,如何尽可能无痛地将96列放入阵列。

我可以用普通的SqlDataReader来做到这一点,因为DataRow允许索引访问,但我不知道我是否可以声明一些属性或编写一些最小数量的代码来直接使用LINQ2SQL类。

至少,我愿做

dataContext.ExecuteQuery<Foo>("SELECT * FROM Foo"); 
+0

如果您想知道“96”。每天的每个小时有一个值:-) – TToni 2010-01-07 12:32:50

回答

2

哦,那是......很好吗? DataContext方法总是期望实体类型;没有ExecuteReader,这是一种痛苦(但可以理解,因为它想要表现为ORM)。说实话,我很想用ADO.NET来对抗这个表,但是如果你已经将宽表映射到DataContext,你应该可以使用普通的C#或反射。

由于数量不会改变,除非你有多个表我只是硬着头皮写一些丑陋的代码:

Foo foo = new Foo { Id_This = obj.Id_This, Id_That = obj.Id_That, 
    Values = new double[] {obj.Value1, obj.Value2, ... } }; 

如果你有多个表...反射,可能通过优化Expression

using System; 
using System.Collections.Generic; 
using System.Linq.Expressions; 
class FooUgly 
{ 
    public int IdThis { get; set; } 
    public int IdThat { get; set; } 
    public double Value1 { get; set; } 
    public double Value2 { get; set; } 
    public double Value3 { get; set; } 
} 
class Foo 
{ 
    public int IdThis { get; set; } 
    public int IdThat { get; set; } 
    public double[] Values { get; set; } 
    public Foo() { } 
    internal Foo(FooUgly ugly) 
    { 
     IdThis = ugly.IdThis; 
     IdThat = ugly.IdThat; 
     Values = extractor(ugly); 
    } 
    // re-use this!!! 
    static readonly Func<FooUgly, double[]> extractor = 
     ValueExtractor<FooUgly, double>.Create("Value", 1, 3); 
} 
static class Program 
{ 
    static void Main() 
    { 
     FooUgly ugly = new FooUgly { IdThis = 1, IdThat = 2, Value1 = 3, Value2 = 4, Value3 = 5 }; 
     Foo foo = new Foo(ugly); 
    } 
} 
static class ValueExtractor<TFrom,TValue> 
{ 
    public static Func<TFrom, TValue[]> Create(string memberPrefix, int start, int end) 
    { 
     if(end < start) throw new ArgumentOutOfRangeException(); 
     ParameterExpression param = Expression.Parameter(typeof(TFrom), "source"); 
     List<Expression> vals = new List<Expression>(); 
     for(int i = start ; i <= end ; i++) { 
      vals.Add(Expression.PropertyOrField(param, memberPrefix + i)); 
     } 
     Expression arr = Expression.NewArrayInit(typeof(TValue), vals); 
     return Expression.Lambda<Func<TFrom, TValue[]>>(arr, param).Compile(); 
    } 
} 
+0

Hi Marc,感谢您的及时答复。我特别喜欢可重用表达式的想法。 – TToni 2010-01-07 15:20:48

相关问题