Linq to Entities表加入/ SQL表连接 - ASP.NET

时间:2014-11-11 15:42:53

标签: c# asp.net linq-to-entities

我已设置此表:

  

tblOne - 一个/唯一记录

     
      
  • personID(主键)
  •   
  • fieldOne
  •   
     

tblTwo - 很多

     
      
  • personID(外键)
  •   
  • fieldTwo
  •   
  • otherID
  •   
     

tblThree - 很多

     
      
  • personID(外键)
  •   
  • fieldThree
  •   
     

tblFour - 很多

     
      
  • personID(外键)
  •   
  • fieldFour
  •   

代码隐藏中的代码:

var tmp = textbox.Text;
var entity = new Entities();
var base = entity.tblTWO.Where(x => x.otherID == tmp)
                        .Select(x => new
                          {
                             otherID = tmp,
                             personID = x.personID,
                             fieldOne = x.tblONE.fieldOne
                            //Need fields from tblThree and tblFour
                          })
                        .ToList();

理论上,我希望能够搜索otherID并从所有4个表中提取所有相关字段。

所以,如果我在otherID = 123上搜索并且该记录的personID = 999,那么我将从tblOne,tblTwo和tblThree中提取所有数据,用于personID = 999.

我在代码隐藏中使用Linq to Entities,并且只搜索tblTwo并从tblOne获取相关字段。然后我了解到我可以遵循多对一的路线,但不是相反的(因此当我尝试将tblOne跟踪到tblThree或tblFour时,我会陷入困境。)

我试图拉动这些字段并将它们绑定到单独的控件以便在Web应用程序中显示记录(即,gridview中字段1的所有唯一记录)。 Linq to Entities不是正确的方法吗?我认识的人提到过尝试SQL,但我不确定如何正确地加入所有这些表以获得我需要的东西。

任何帮助将不胜感激!!!非常感谢你。 :)

4 个答案:

答案 0 :(得分:0)

为什么不匹配" OtherID"在table2中,检索PersonID。

并使用新的PersonID变量来执行Linq表达式以从其他表中检索必要的数据(假设它们共享相同的PersonID,这是从SQL设置中看起来的样子)。

var pID = entity.tblTWO.Where(x => x.Other_ID == tmp).Select(x => x.personID).toString(); //This retrieves the personID from table2, which you will use to search the other tables
var list = entity."sometable".Where(y => y.personID == pID).Select("Data").toList();     //Using the above PersonID, you search any table you want for a match and retrieve any data you need using "Select"

编辑: 如果您正在讨论表连接,请参阅一些SQL语句。首先,您必须考虑是否需要将这些表分开,如果每个表都包含与每个personID类似的信息,我建议加入表格。

我不清楚你在寻找什么? 在您的代码中,要搜索的临时ID来自文本框。 因此,您获取此用户输入,并首先搜索表2以找到匹配的otherID,找到匹配后,您现在使用此personID检索此表的personID表单(应在每个表之间共享),您现在可以搜索剩余的表格并提取数据并存储它们,无论你需要什么。

答案 1 :(得分:0)

根据您的表格详细信息,由于tblThree和tblFour是1-To-Many到tblOne,因此这些表中的字段不是单个实体的集合,有不同的方法可以访问它们:

你详细说明它看起来应该是一个集合:

.Select(x => new
{
    MyCollection = x.tblOne.tblThree.Select(t=> new MyObject(t)).ToArray()
}

如果您只是获得第一个值(请注意,如果personID不在tblThree中,则会失败):

.Select(x => new
{
    firstFieldThree = x.tblOne.tblThree.First().fieldThree
}

如果tblThree和tblFour中确实有一个值,那么personID应该是主键和外键,那么你就可以像这样访问它们:

.Select(x => new
{
    fieldThree = x.tblOne.tblThree.fieldThree
}

答案 2 :(得分:0)

您需要将所有表格加在一起。如果您需要DefaultIfEmpty,请使用left join。您可以使用如下所示的实体1导航属性:

var base = from t1 in entity.t1
           from t2 in t1.t2.DefaultIfEmpty()
           from t3 in t1.t3.DefaultIfEmpty()
           from t4 in t1.t4.DefaultIfEmpty()
           where t2,otherID == tmp
           select new
           {
             otherID = tmp,
             t2.personID,
             t1.fieldOne,
             t3.fieldThree,
             t4.fieldFour
           };

答案 3 :(得分:0)

var base = entity.tblTwo.Where(x => x.otherID == temp)
            .Select(x => new
            {
                OtherId = temp,
                PersonId= x.personID,
                FieldOne = x.tblOne.fieldOne,
                FieldThree = x.tblOne.tblThree.fieldThree,
                FieldFour = x.tblOne.tblFour.fieldFour
            }).ToList();

你也可以加入四个表 -

var base = (from t1 in entity.tblOne
                     join t2 in entity.tblTwo on t1.personID equals t2.personID
                     join t3 in entity.tblThree on t1.personID equals t3.personID
                     join t4 in entity.tblFour on t1.personID equals t4.personID
                     where t2.otherID == temp
                     select new{
                         OtherId = temp,
                         PersonId = t1.personID,
                         FieldOne = t1.fieldOne,
                         FieldThree = t3.fieldThree,
                         FieldFour = t4.fieldFour
                     }).ToList();