C# Linq到SQL 3表,以列表形式获取结果

C# Linq到SQL 3表,以列表形式获取结果,c#,asp.net,database,linq,linq-to-sql,C#,Asp.net,Database,Linq,Linq To Sql,今天我问了这个问题,但我遗漏了一些东西,我将在这个问题中详细描述 我有三张桌子: [Table1] - ID // Unique - Name - Location - Country [Table2] - ID - Unique - Table1.ID - Value [Table3] - Table2.Value - LN - Name 关系: 一个Table1.ID到多个Table2.Table1.ID 我需要的是使用sql查询,在那里我会得到类似这样的结果 从表

今天我问了这个问题,但我遗漏了一些东西,我将在这个问题中详细描述

我有三张桌子:

[Table1]
 - ID // Unique
 - Name
 - Location
 - Country

[Table2]
 - ID - Unique
 - Table1.ID
 - Value

[Table3]
 - Table2.Value
 - LN
 - Name
关系:

一个Table1.ID到多个Table2.Table1.ID

我需要的是使用sql查询,在那里我会得到类似这样的结果

从表1中获取所有信息 对于Table2.Table1.ID中的所有Table1.ID,将Table2.Value获取为数组int 对于所有作为arrayint的Table2.value,获取数组字符串Table3.Name,其中Table2.value等于Table3.Table2.value,LN=en 例如:

表1

 ID |  Name    |  Location    |   Country   |
  1 | TestName | TestLocation | SomeCountry |
表2

 ID  |  FK | Val |
  1  |  1  |  5  | 
  2  |  1  |  7  |
表3

Val | Ln |  Name     |
  5 | en | Testname1 |
  7 | en | Testname2 |
结果:

1,TestName,TestLocation,SomeCountry,List<string>{Testname1,Testname2}
我的ling to sql查询只获取表2。值作为列表,也许您可以进行一些修改

 var result = (from t1 in context.Table1

              select new CLASS
              {
                  ID = t1.ID,
                  NAME = t1.Name,
                  LOCATION = t1.loc,
                  COUNTRY = t1.Country,
                  CategoryArray = new List<int>(t1.Tabel2.Select(p => p.CategoryID).ToArray())

              }).Take(10).ToList();

ASP.NET C 4.0 LINQ TO SQL

您需要一个子查询;试试这个:

{
    ID = t1.ID,

    NAME = t1.Name,

    LOCATION = t1.loc,

    COUNTRY = t1.Country,

    CategoryArray = (from t3 in Table3
                     where t2.Value == t3.Value && t3.Ln == "en"
                     select t3.Name).ToList()
}
如果在类对象模型中将CategoryArray定义为List,则需要使用.ToList而不是.ToArray


我没有发现这一点很清楚:对于所有作为arrayint的Table2.value,获取数组字符串Table3.Name,其中Table2.value等于Table3.Table2.value,LN=en不确定子查询是否还需要与Table1的联接。

在本例中,多联接是否可行

我想到了以下几点:

 var result =   from a in table1
                join b in table2 on a.id equals b.table1id
                join c in table3 on b.value equals c.table2value
                select new {Value = b.value, Name = c.Name}
我不确定您希望按什么对结果进行分组-但是如果上述方法有效,那么您可以按值或id进行分组,以获得名称列表。 但是,如果没有这些数据,要测试这一点并不容易

编辑:

如果您对文章中的查询感到满意,那么要获取与CategoryArray中的所有值关联的所有名称的列表,您可以尝试以下查询:

var res = table3
            .Where(c => CategoryArray.Contains(c.table2value))
            .Select(c => c.Name)
            .ToList();

您还可以使用此功能:

public List<string> GetClientImagePath()
        {
            //return objDAL.GetClientImagePath();
            List<string> clientimagepath = new List<string>();
            DataSet ds = new DataSet();

            try
            {
                ds = objDAL.GetClientImagePath();
                if (ds.Tables.Count > 0)
                {
                    ds.Tables[0].TableName = "clientimagepath";
                    clientimagepath = (from DataRow dr in ds.Tables["clientimagepath"].Rows
                                       select Convert.ToString(dr["ImagePath"])
                                        ).ToList();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return clientimagepath;
        }

索要清单几乎总是错误的。试着用IEnumerable来代替它。@frenchie它强迫你一次将所有结果加载到RAM中,这通常是不可取的,它将你绑定到一个特定的集合类型,而不是创建可以轻松使用的代码,不管你想要什么样的序列,这意味着任何进一步的结果组合都必须首先迭代到目前为止的所有内容,而不存在任何延迟枚举的机会?他想要一个不是最佳名称的类的列表,顺便说一句,他马上就得到了这样的列表。这和我的查询完全一样,但是因为[a]可以有很多[b]我收到的结果像id=1,name=test,value=test1id=1,name=test,value=test2id=1,name=test,value=test3,但是我需要这样的id=1,name=test,value=test1,test2,test3@NovkovskiStevoBato-这是否意味着表1ID相同的所有项目将具有相同的名称?否则,你能解释一下你是如何从上面的评论中选择名字的吗?检查Joanna answer,这是正确的查询,但也检查我的评论,看看我想要什么结果。