2014-03-12 137 views
2

我定义了下面的实体类为我的LINQ查询的隐式转换:C#LINQ查询 - 错误

public class Application 
{ 
    public Application() { } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public System.DateTime DateTimeCreated { get; set; } 
    public System.DateTime? DateTimeModified { get; set; } 
    public Employee CreatedBy { get; set; } 
    public Employee ModifiedBy { get; set; } 
} 

public class Employee 
{ 
    public Employee() { } 

    public string EmployeeID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

我创建了下面的查询来创建一个Application对象,并试图以创建一个Employee实体CreatedBy和'ModifiedBy'属性。有时,ModifiedBy列可以包含空值,我想将ModifiedBy属性设置为null。

var query = from a in context.Applications 
      join u1 in context.Employees on a.CreatedBy equals u1.Employee_ID.Trim() 
      join u2 in context.Employees on a.ModifiedBy equals u2.Employee_ID.Trim() 
      where a.ApplicationId == applicationId 
      select new Entity.Application 
      { 
       Id = a.ApplicationId, 
       Name = a.ApplicationName, 
       Description = a.ApplicationDesc, 
       DateTimeCreated = a.DateTimeCreated, 
       CreatedBy = new Entity.Employee{ EmployeeID = a.CreatedBy, FirstName = u1.First_Name, LastName = u1.Last_Name }, 
       DateTimeModified = a.DateTimeModified ?? null, 
       ModifiedBy = (a.ModifiedBy != null) ? new Entity.Employee { EmployeeID = a.ModifiedBy, FirstName = u2.First_Name, LastName = u2.Last_Name } : (Entity.Employee) null, 
      }; 

当调试上面的查询,我得到以下错误:

Type of conditional expression cannot be determined because there is no implicit conversion between 'Employee' and 'Application'

如何解决这个问题?

+0

什么字段/属性'ApplicationId' - 应该说是刚刚'Id'? –

+0

因此,上面的查询工作,如果你删除这一行? 'ModifiedBy =(a.ModifiedBy!= null)?新的Entity.Employee {EmployeeID = a.ModifiedBy,FirstName = u2.First_Name,LastName = u2.Last_Name} :(Entity.Employee)null,' – Nate

+0

@nate - 是的,当我移除引用的行时,你的评论。 –

回答

0

经过一些额外的研究,这里是修改后的代码片段,最终为我工作:

var result = (from a in context.Applications 
       join u1 in context.Employee on a.CreatedBy equals u1.Employee_ID.Trim() 
       join u2 in context.Employee on a.ModifiedBy equals u2.Employee_ID.Trim() into us 
       from u2 in us.DefaultIfEmpty() 
       where a.ApplicationId == applicationId 
       select new Entity.Application() 
       { 
        Id = a.ApplicationId, 
        Name = a.ApplicationName, 
        Description = a.ApplicationDesc, 
        DateTimeCreated = a.DateTimeCreated, 
        CreatedBy = new Entity.Employee 
        { 
         EmployeeID = a.CreatedBy, 
         FirstName = u1.First_Name, 
         LastName = u1.Last_Name 
        }, 
        DateTimeModified = a.DateTimeModified ?? null, 
        ModifiedBy = new Entity.Employee 
        { 
         EmployeeID = a.ModifiedBy ?? string.Empty, 
         FirstName = u2.First_Name ?? string.Empty, 
         LastName = u2.Last_Name ?? string.Empty 
        } 
       }).Single(); 
3

它可能不会直接解决您收到的错误,但根本不需要该查询,因为您已设置导航属性。使用Include,而不是它应该只是罚款 - EF将加入必要加入你:

var query context.Applications 
       .Include("ModifiedBy") 
       .Include("CreatedBy") 
       .Where(a => a.ApplicationId == applicationId); 
+0

当我尝试查看此查询的结果视图时,我在调试模式下收到以下消息:儿童无法评估。 –

2

有两件事情我注意到

join u1 in context.Employees on a.CreatedBy equals u1.Employee_ID.Trim() 
join u2 in context.Employees on a.ModifiedBy equals u2.Employee_ID.Trim() 

你无法加入这个样子,因为CreateByModifiedByEmployee型的,而不是string

而且,看看这个:

(Entity.Employee) null 

您不能将null转换为Employee。你可能想在将来使用该类型的默认值:

default(Entity.Employee) 

UPDATE

正如在评论中指出,这是合法的投空到​​,但因为你最终与空反正这个练习没有多大意义。 default(Entity.Employee)也会导致为null,因为这是参考类型的默认值,但default可以为各种其他类型提供不同的值,有时可能会有用。

+0

我同意'join',但你绝对可以将'null'投给'Entity.Employee'。 – MarcinJuraszek

+0

确实!我必须从我的C#前的日子里带出一些假设! –

+0

上下文应用程序表中的'CreatedBy'和'ModifiedBy'列被定义为字符串。我正在进行连接以从“Employee”视图的上下文获取员工信息 –