【问题标题】:how to concatenate a field in linq to sql如何将linq中的字段连接到sql
【发布时间】:2011-09-29 12:13:31
【问题描述】:

我想在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 数据上下文,其中包含站点和部门实体以及将部门与站点相关联的 SiteDept 实体。

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

我正在考虑以下几点。

   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'。”

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

【问题讨论】:

  • 认为 LINQ 识别string.Concat。如果没有,请选择作为动态对象,然后针对allSiteDepts.AsEnumerable() 执行新查询,您将能够使用常规方法。

标签: linq-to-sql


【解决方案1】:

问题在于 SiteDept 是您的实体之一,它不允许您直接创建实体。处理这个问题的方法是设置实体之间的关系并让 LINQ to SQL 获取所有实体,然后使用分部类上的属性来填写您需要的名称。

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; }
     }
}

【讨论】:

  • 我希望 SiteDept 不被用作 DTO。如果您的数据库架构发生变化,那似乎将是一场恐怖表演......
  • @BradChristie - 看起来它是一流的实体,如果没有主要的数据库重构(可能还伴随着组织变化),几乎不可能改变。修复该属性可能是您最不担心的事情。另一种选择是选择完全不同的实体模型,但这似乎不是本意。
  • 是的,我使用 siteDept 作为 DTO。使用 LINQ to SQL 实体作为 DTO 不是一个好主意吗?
  • @DavidKethel - LINQ to SQL 实体本质上是数据访问对象/域实体。如果您修改它们(然后是数据上下文中的 SaveChanges),那么您就是在修改数据库。您应该根据需要从实体对象创建 DTO。
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多