C#中带有Tuple列表的Linq查询

3

我有2个数据库表。

Calculate表中,我有1行,通过IdCalculdateData表中的多行映射。

现在我需要从Calculate表中加载数据,并将所有相关详细信息从CalculdateData表中获取。

如何将详细信息放入Tuple-List中?

因此,对于每行CalculateData,我有4列需要放入元组中。也就是说,如果我有4行,我需要在列表中创建4个元组。

IEnumerable<Storage> context = new MyEntities();

var Result = (from a in context.calculate
             join b in context.CalculateData on a.Id equals b.CalcId into c
             where a.SpecialID == 2023 && a.VersionId == 1
             orderby a.InternalOrderNr ascending
             select new Storage
             {
                myField1 = a.Field1;
                myField2 = a.Field2;
                myField3 = a.Field3;
                < MISSING PART AND QUESTION >
             }).ToList();

            return Result;


public class Storage
{
            public int myField1;
            public int myField2;
            public int myField3;
            public List<Tuple<int, int, string, decimal>> myField4;
}
2个回答

1
这应该可以工作:

        var Result = (from a in calculate
                      join b in calculateData on a.Id equals b.CalcId into c
                      where a.SpecialID == 2023 && a.VersionId == 1
                      orderby a.InternalOrderNr ascending
                      select new Storage
                      {
                          myField1 = a.Field1,
                          myField2 = a.Field2,
                          myField3 = a.Field3,
                          myField4 = c.Select(d => new Tuple<int, int, string, decimal>
                                                   (d.Field1, d.Field2, d.Field3, d.Field4))
                                                   .ToList()
                      }).ToList();

        return Result;

同时,检查一下这个查询是否可以转换为单个的SQL请求,而不是在每个元组列表创建时都进行新的SQL请求,这将是一个好习惯。

编辑:如果您在查询中遇到自定义类型的问题(如@Toxantron所指出的),则应该使用此选择:

    var queryResult = (from a in calculate
                              join b in calculateData on a.Id equals b.CalcId into c
                              where a.SpecialID == 2023 && a.VersionId == 1
                              orderby a.InternalOrderNr ascending
                              select new
                              {
                                  a.Field1,
                                  a.Field2,
                                  a.Field3,
                                  myField4 = c.Select(d => new {
                                               d.Field1, d.Field2, d.Field3, d.Field4})


                              }).ToList();
    result = queryResult.Select(r => new Storage
    {
        myField1 = r.Field1,
        myField2 = r.Field2,
        myField3 = r.Field3,
        myField4 = r.myField4.Select(t => new Tuple<int,int,decimal,string>
                                          (t.Field1, t.Field2, t.Field3, t.Field4))
                             .ToList()
    })

    return Result;

2
我不确定最新的Entity Framework,但在EF 6.1之前,在Linq2Entities中使用非默认构造函数是不可能的。 - Toxantron
1
@Toxantron,这也是我的担忧,我认为目前还不可能,我们将不得不选择匿名类型并在选择后进行转换。 - Andrey Tretyak
我认为只有在内存中才能进行“选择”。 - Eldho
1
@Eldho 匿名类型选择应该在数据库端工作。元组列表选择可能会有问题(可能会创建子请求),我猜这个问题可以解决,但没有在真实数据库上测试,无法百分之百确定解决方案。 - Andrey Tretyak
大家好,很棒的帖子。使用您上面的片段可以工作。但是我还有另一个棘手的任务要解决。例如: 这是元组:public List<Tuple<int, int, string, decimal>> myField4;字符串描述十进制值。 1,2,来自数据库列1的值,ValueColumn1 1,2,来自数据库列2的值,ValueColumn2 1,2,来自数据库列3的值,ValueColumn3你明白我想说什么吗? - Maik
显示剩余2条评论

0
你可以尝试这样做。但是这还没有经过测试。
select new Storage
 {
         myField1 = a.Field1,
         myField2 = a.Field2,
         myField3 = a.Field3,
         myField4 = c.Select(d => new Tuple<int, int, string, decimal>(d.Field1, d.Field2, d.Field3, d.Field4)).ToList()
 }).ToList();

这完全基于这个教程


不,这不是我想要的。字段myField1,myField2和myField3包含一个值,而myField4可以包含多个值。myField4是一个列表(List<Tuple<int, int, string, decimal>> myField4)请查看我定义的Storage类。 - Maik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接