我需要从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数据显示和格式化而装饰的模型类型。我试图避免的一件大事就是代码中多个地方的同一长篇属性分配。
答案 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
循环中实际读取MyT2
或for
的那一刻。