如何将linq中的字段连接到sql

时间:2011-09-29 04:01:38

标签: linq-to-sql

我想在Linq to SQL中实现以下sql查询。

 SELECT     TOP dbo.SiteDept.SiteDeptId, dbo.Site.SiteName + ' / ' + dbo.Dept.DeptName AS SiteDeptName, dbo.SiteDept.SiteId, dbo.SiteDept.DeptId, 
                      dbo.Dept.DeptName
FROM         dbo.SiteDept INNER JOIN
                      dbo.Site ON dbo.SiteDept.SiteId = dbo.Site.SiteId INNER JOIN
                      dbo.Dept ON dbo.SiteDept.DeptId = dbo.Dept.DeptId

我有一个Linq to SQL数据上下文,包含一个站点和Dept实体以及一个将部门与站点相关联的SiteDept实体。

我还在SiteDeptName的SiteDept分部类的自定义字段中添加了。

我正在思考以下几点。

   public IEnumerable<SiteDept> GetAllSiteDepts()
    {
        var dataContext = new AtomWebDataContext(_connectionString);

        var allSiteDepts = from sd in dataContext.SiteDepts
                           join s in dataContext.Sites
                               on sd.SiteId equals s.SiteId
                           join d in dataContext.Depts
                               on sd.DeptId equals d.DeptId
                           select new SiteDept()
                                      {
                                          SiteDeptId = sd.SiteDeptId,
                                          SiteId = sd.SiteId,
                                          DeptId = sd.DeptId,
                                          SiteDeptName = s.SiteName + "/" + d.DeptName
                                      };
        return allSiteDepts;
    }

但是我得到了“在查询中明确构造实体类型'GPSO.Repository.SiteDept'是不允许的。”

什么是实现我想要的最佳方式?

1 个答案:

答案 0 :(得分:0)

问题是SiteDept是您的某个实体,它不会让您直接创建一个实体。处理这个问题的方法是设置实体之间的关系,让LINQ to SQL全部获取它们,然后使用partial类上的属性来填写你需要的名称。

public IEnumerable<SiteDept> GetAllSiteDepts()
{
    var dataContext = new AtomWebDataContext(_connectionString);

    var allSiteDepts = from sd in dataContext.SiteDepts
                       select s;

    return allSiteDepts.ToList();
}

// Site and Dept are EntityRefs on SiteDept and Site, respectively
public partial class SiteDept
{
     public string SiteDeptName
     {
         get { return this.SiteName + "/" + this.Site.Dept.Name; }
     }
}