我已设置此表:
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,但我不确定如何正确地加入所有这些表以获得我需要的东西。
任何帮助将不胜感激!!!非常感谢你。 :)
答案 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();