.net 如何从LINQ中获取多个记录类型?
我需要从LINQ的一个连接中获得2种记录类型。我不希望在联接之外创建一个合并类型,因为它们都有大约24个列,并且我已经定义了MVC模型类型,以从两个表中的每个表接收类型 到目前为止,我有这样的想法:.net 如何从LINQ中获取多个记录类型?,.net,linq,.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 ne
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
声明“只支持无参数构造函数。”
我的下一步将只是创建一个for循环来提取模型类。我只是想知道是否有更好的方式进行转移
添加:
为了增加清晰度,我需要从recT传输数据?类型转换为T?模型类型。T?模型类型是为MVC数据显示和格式化而修饰的模型类型。我试图避免的一件大事是代码中多个位置的相同长的属性赋值列表。试试这个
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 };
在我看来,你也可以做到这一点:
var aT12 = qry.Select( obj => new T1and2()
{
T1 = obj.MyT1,
T2 = obj.MyT2
})
.ToArray();
我不知道构造函数是否包含任何处理逻辑。如果是这样,您可以将该处理推迟到
MyT1
或MyT2
在for
循环中实际读取的时刻。谢谢,尤里。但我认为这与当前使用的匿名对象没有任何区别。匿名对象可以很好地嵌套来自查询的多个对象。它从实体类型转换到我的模型类型,而问题似乎正在发生。如果我误读了你的建议,请告诉我。我刚才看到了T1and2,想到了Tuple。我应该更清楚使用的类型。我不希望“实体”类型来自表定义。我希望将数据传输到设计为作为模型对象公开的类型中。模型类型已使用用于格式化和标签的显示属性进行装饰。我试图将数据从两个实体类型传输到两个模型类型,但没有显式地分配所有属性。我创建了用于传输的构造函数,这样我就可以重用该逻辑,而不必在一堆不同的地方传输相同长的字段列表。好吧,您可以将构造函数逻辑传输到属性的setter,并只设置属性。两次是helluva反模式,但可能是可以原谅的,因为无参数构造函数的要求迫使你这么做。是的。但如果我被迫朝那个方向走,使用for循环就更容易了。我真的只是想弄清楚,是否有一种巧妙的方式(一条线)来进行转换,我不知道。这看起来像是一个硬性限制。我应该更清楚使用的类型。我不希望“实体”类型来自表定义。我希望将数据传输到设计为作为模型对象公开的类型中。模型类型已使用用于格式化和标签的显示属性进行装饰。我试图将数据从两个实体类型传输到两个模型类型,但没有显式地分配所有属性。我创建了执行传输的ctor,这样我就可以重用该逻辑,而不必在一堆不同的地方传输相同的长列表字段。