C# 如何在实体框架中连接两个或多个表,并在数据网格视图中显示每个表中的选定列

C# 如何在实体框架中连接两个或多个表,并在数据网格视图中显示每个表中的选定列,c#,entity-framework,C#,Entity Framework,我使用VS从数据库生成了实体。现在,当我想从数据库连接两个表并使用datagrid视图显示结果时 我的LINQ是: result = (from lang in my_entity.LANGUAGE join c in my_entity.COUNTRY on lang.COUNTRY_ID equals c.ID

我使用
VS
从数据库生成了实体。现在,当我想从数据库连接两个表并使用datagrid视图显示结果时

我的LINQ是:

 result = (from lang in my_entity.LANGUAGE
                              join c in my_entity.COUNTRY
                              on lang.COUNTRY_ID equals c.ID
                              select lang).ToList<LANGUAGE>();

dgvresult.DataSource  =  result;
dgvresult.Refresh();
result=(来自my_entity.LANGUAGE中的lang)
在我的国家加入c
关于lang.COUNTRY_ID等于c.ID
选择lang.ToList();
dgvresult.DataSource=结果;
dgvresult.Refresh();
将显示语言表中的所有列,但未显示国家/地区表中的任何列。 我希望在datagrid视图中显示language中的几列和country表中的几列

我该怎么做呢。任何学习链接也非常感谢。 我还想详细了解DataGrid视图。如果有人能推荐好的书籍或材料,请推荐。

(…).ToList()
(...).ToList<LANGUAGE>()
.Select(p=>new{p.LanguageProp,p.COUNTRY.COUNTRYProp,...})
.Select(p=>new{p.LanguageProp,p.COUNTRY.COUNTRYProp,…})
您可以创建一个新的匿名类型,然后绑定到它,如下所示:

 result = (from lang in my_entity.LANGUAGE
                              join c in my_entity.COUNTRY
                              on lang.COUNTRY_ID equals c.ID
                              select new 
                              { 
                                   lang.Col1,
                                   land.col2,
                                   c.Col1,
                                   c.Col2
                              }).ToList();

dgvresult.DataSource  =  result;
dgvresult.Refresh();
或者,您可以创建视图模型,只需在其中选择值:

public class LangCountryModel 
{
    public string LangCol1 { get; set; }
    public string LangCol2 { get; set; }
    public string CountryCol1 { get; set; }
    public string CountryCol2 { get; set; }
}

     result = (from lang in my_entity.LANGUAGE
                                  join c in my_entity.COUNTRY
                                  on lang.COUNTRY_ID equals c.ID
                                  select new LangCountryModel 
                                  { 
                                       LangCol1 = lang.Col1,
                                       LangCol2 = land.col2,
                                       CountryCol1 = c.Col1,
                                       CountryCol2 = c.Col2
                                  }).ToList();

类似于@pingoo answer,只需一个小编辑:

通过使用源表
语言
的导航属性
COUNTRY
,您可以在不使用
Join
LINQ关键字的情况下执行此操作,如下所示:

result = (from lang in my_entity.LANGUAGE
                select new {
                          lang.Col1,
                          lang.col2,
                          lang.COUNTRY.COUNTRY_ID
                          }).ToList();
dgvresult.DataSource = result; dgvresult.Refresh();`

谢谢你的回答。你能解释一下吗。我有错误。我的函数签名是:public-IList-GetLanguage(FILTER-FILTER,String-param){}如果使用您的解决方案,我会遇到错误。你能解释一下吗?+1因为视图模型的建议。从长远来看,这通常是一个更好的解决方案。如果我将匿名查询包含到函数中,那么函数的返回类型是什么?您可以将其作为System.Object(我认为…)返回,但您确实不应该返回,因为它非常粗糙。如果您想将调用封装在一个方法中,我建议使用强类型视图模型路线。返回类型将是IEnumerable。您也可以不使用
Join
LINQ关键字,通过使用源表
LANGUAGE
的导航属性
COUNTRY
,如下所示:
result=(从my_实体中的lang.LANGUAGE选择new{lang.Col1,lang.col2,lang.COUNTRY.COUNTRY_ID}).ToList();dgvresult.DataSource=result;dgvresult.Refresh();
result = (from lang in my_entity.LANGUAGE
                select new {
                          lang.Col1,
                          lang.col2,
                          lang.COUNTRY.COUNTRY_ID
                          }).ToList();
dgvresult.DataSource = result; dgvresult.Refresh();`