LINQ to Entities查询使用join inside方法在MVC app中使用

时间:2012-11-09 18:39:00

标签: asp.net-mvc linq tsql

在我的Person表中是一个存储位置ID的RequestedLocation列。这些ID与Locations表中的LocationId列匹配,Locations表还具有LocatioName列中的文本位置名称。

在我看来,我需要在视图中显示字符串LocationName,并将Person模型传递给它。该视图将显示telerik网格中的人员列表。除了RequestedLocation列是全部整数之外,它的工作原理很好。

我使用包含LINQ查询的方法填充所有网格。以下是目前有效的方法:

    public List<Person> GetPeople()
    {
        var query = from p in _DB.Person.ToList()
                    select p;

        return query.ToList();
    }

这是常规的SQL查询,我需要转换为LINQ:

SELECT ApplicantID
      ,FirstName
      ,LastName
      ,MiddleName
      ,DateofBirth
      ,Gender
      ,RequestedVolunteerRole
      ,RequestedVolunteerLocation
      ,l.LocationName
  FROM Form.Person p
  JOIN dbo.Location l ON p.RequestedVolunteerLocation = l.LocationID
  Order BY ApplicantID 

这是我尝试转换为LINQ:

    public List<NewApplicantViewModel> GetPeople()
    {
        var query = from pl in _DB.Person.ToList()
                    join l in _Elig_DB.Locations.ToList() on pl.RequestedVolunteerLocation equals l.LocationID
                    select new
                    {
                        pl.RequestedVolunteerLocation = l.LocationName

                    };
        return query.ToList();

我从中获得的错误数量很多,但大多数都是:

Cannot convert from type Annonymous to Type List<NewAPplicantModel>

Invalid annonymous type declarator.

请帮忙,谢谢你阅读我的帖子。

哦,而且我只编程了几个月,所以如果我说的都错了,请告诉我。我必须坚持的是表结构,因为它是我正在更新的现有应用程序,更改位置或人员表会产生很大的后果。

2 个答案:

答案 0 :(得分:2)

您收到错误的原因是您正在投射匿名类型

 select new
                {
                    pl.RequestedVolunteerLocation = l.LocationName

                };

相反,您需要投影NewApplicantViewModel

 select new NewApplicantViewModel
                {
                    RequestedVolunteerLocation = l.LocationName

                };

答案 1 :(得分:2)

public List<NewApplicantViewModel> GetPeople()
{
    var query = from pl in _DB.Person
                join l in _Elig_DB.Locations on pl.RequestedVolunteerLocation 
                equals l.LocationID
                select new NewApplicantViewModel
                {
                    LocationName = l.LocationName,
                    otherPropery = p.Property
                };
    return query.ToList();
 }

小心调用_DB.Person.ToList(),它将从DB加载所有人,因为ToList()会立即执行查询,并且连接将在内存中执行(而不是在DB中)。