如何从LINQ中获取多种记录类型?

时间:2012-12-18 05:11:59

标签: .net linq

我需要从LINQ的连接中获取2种记录类型。我不希望从连接中创建单个合并类型,因为它们都有大约24个列,并且我已经定义了从两个表中的每一个接收类型的MVC模型类型。

到目前为止,我有这样的事情:

var qry = from recT1 in db.Tbl1
          join recT2 in db.Tbl2 on recT1.colA equals recT2.colA
          where recT1.colA != null
          select new { MyT1 = recT1, MyT2 = recT2 };

然后,我试图做一些光滑的事情:

public class T1and2
{
    public T1Model T1 { get; set; }
    public T2Model T2 { get; set; }
}

T1and2[] aT12 = qry.Select( obj => new T1and2()
    {
        T1 = new T1Model(obj.MyT1),    //-- these ctors defined separately
        T2 = new T2Model(obj.MyT2)
    })
    .ToArray();

但是这给了我一个运行时NotSupportedException来说明"Only parameterless constructors are supported."

我的下一步是简单地创建一个for循环来提取模型类。我只是想知道是否有更好的方法来进行转移。

添加: 为了增加清晰度,我需要从recT传输数据?类型为T?模型类型。 T?模型类型是为MVC数据显示和格式化而装饰的模型类型。我试图避免的一件大事就是代码中多个地方的同一长篇属性分配。

2 个答案:

答案 0 :(得分:0)

试试这个

var aT12 =
    from obj in qry
    let t1 = new T1Model(obj.MyT1)
    let t2 = new T2Model(obj.MyT2)
    select mew T1and2 { T1 = t1, T2 = t2 };

答案 1 :(得分:0)

在我看来,你也可以这样做:

var aT12 = qry.Select( obj => new T1and2()
    {
        T1 = obj.MyT1,
        T2 = obj.MyT2
    })
    .ToArray();

我不知道构造函数是否包含任何处理逻辑。如果是这样,您可以将处理推迟到MyT1循环中实际读取MyT2for的那一刻。