Linq-从链接表中检索值

Linq-从链接表中检索值,linq,Linq,我有以下模型和关系: Table: Granddad GranddadID GranddadName Table: Father FatherID GranddadID FatherName Table: Son SonID FatherID SonName 在祖父控制器中: public ActionResult Edit(int tmpgranddadid) { var q = (from g in _e.Grandad where g.GrandadID

我有以下模型和关系:

Table: Granddad
GranddadID
GranddadName

Table: Father
FatherID
GranddadID
FatherName

Table: Son
SonID
FatherID
SonName
在祖父控制器中:

public ActionResult Edit(int tmpgranddadid)
{
   var q = (from g in _e.Grandad
           where g.GrandadID == tmpgranddadid
           select g).FirstOrDefault();

   string son_name = q.Father.Son.SonName.ToString(); // <- is wrong, how to do this?

   return View(q);
}
public ActionResult编辑(int-tmpgranddadid)
{
var q=(来自g in_e.Grandad
其中g.GrandadID==tmpgranddadid
选择g).FirstOrDefault();
字符串son_name=q.Father.son.SonName.ToString();//签出联接:


也许你想要这么多儿子中的任何一个

q.Fathers.First().Sons.First().SonName.ToString();
但是要小心,因为如果父亲没有儿子,First()会抛出异常。这将处理这种情况:

string sonName = null;
Father father = q.Fathers.FirstOrDefault();
if (father != null) {
    Son son = father.Sons.FirstOrDefault();
    if (son != null) {
        sonName = son.SonName.ToString();
    }
}

假设您的数据源如下所示:

public class SomeDataSource
{
    public List<Granddad> Granddad;
    public List<Father> Father;
    public List<Son> Son;
}

这就是你需要的吗?

你应该遵循命名准则。只是一个旁注。@Filip:想澄清一下,我认为这里有很多命名准则可以适用。一个父亲可以有不止一个儿子。你想要哪一个?关于命名。我想son.SonName非常混乱(可能是儿子的名字?).Son.Name有什么问题?你应该有一个与同一个表imho有父亲关系的Person表。这很愚蠢,没有父亲的祖父根据定义只能是一个儿子。哈哈,谢谢马克:)我简化了它并尝试了。但是我得到了一个错误:q.Fathers.First().FatherName.ToString()。错误是:对象引用未设置为对象的实例。请帮助:)除了使用First()之外,还有其他方法可以用于指定[n]子/元素吗?我尝试使用ElementAt(0),但不知道如何使用AsQueryable,但都失败了:(谢谢我已经更新了我的答案,向您展示了如何处理父亲没有儿子的情况。您可能需要检查引用是否加载了
IsLoaded()
Load()
,如果需要的话。谢谢mark:)尝试并获得:“序列不包含任何元素。”检查了父表,有数据…有什么想法吗?亲爱的Codesleuth。谢谢:)抱歉,尝试您的示例有点慢,我真的很新。我厌倦了您的代码,但当我进入“加入父-加入e.father-on-son.FatherID”时,我无法显示父ID。在我的模型视图中,父ID类似于“导航属性”
var firstGrandson = (from son in _e.Son
               join father in _e.Father on son.FatherID equals father.FatherID
               join granddad in _e.Granddad on father.GranddadID equals granddad.GranddadID
               where granddad.GranddadID == tmpgranddadid
               select son).FirstOrDefault();

if (firstGrandson == null)
    throw new Exception("This granddad has no grandsons.");

string son_name = firstGrandson.SonName;