2011-04-28 109 views
7

我正在致力于一个简单的命令行应用程序,教我自己在C#中的一些LINQ to SQL。我有一个SQL Server 2008实例,我试图在MSDB中查找当前在SQL Server上设置的作业。我要输出的作业名点和步骤名称和实际的SQL语句来做到这一点是:LINQ to SQL关联映射

use msdb 
go 

select j.name + '.' + s.step_name 
from sysjobs j 
join sysjobsteps s on j.job_id = s.job_id 
order by j.name 
go 

我在为如何建立在C#SysJobs和SysJobSteps之间的关系的损失代码和我不断收到以下错误信息:

System.InvalidOperationException: Invalid association mapping for member 
'ServerCompare.Lib.Commands.SysJob.SysJobSteps'. 
'ServerCompare.Lib.Commands.SysJob' is not an entity. 

请指教是什么做的最好方法?

+2

给我们一些linq-to-sql代码! – Nix 2011-04-28 20:53:34

+0

我已经在C#中发布了示例代码,我试图在这里完成:https://gist.github.com/947347 – 2011-04-28 21:13:12

回答

18

这两个表都必须有一个定义的主键。使用Column(Name="whatever_id", IsPrimaryKey=true)

+4

我很确定这是为大多数人解决问题的答案。 – 2012-12-19 21:11:08

3

您需要首先创建一个DBML文件,加入这两个表,然后用这样的:

using (var context = new DataClasses1DataContext()) 
      { 
       var result = from s in context.sysjobs 
          orderby s.name 
          join sjs in context.sysjobsteps on s.job_id equals sjs.job_id 
          select new {Name = s.name + "." + sjs.step_name}; 

      } 

要创建具有系统表DBML,你需要做的创建连接,然后再右键单击服务器 - >更改视图 - >对象类型,您现在应该可以看到所有系统表。然后添加这两个表。

+0

你将如何手动使用属性? – 2011-04-28 21:54:23