如何根据另一个属性值将一个导航属性与不同的表相关联?

问题描述

我有一个特别的要求。 我正在使用没有关系的现有数据库,我无法更改数据库结构或表,因此我仅通过 EntityFramework 使用关系。

我有三张桌子:

public class Repairs
{
    public int Id {get; set;}
    //[more properties...]

    public int IDCategory{ get; set; }
    public int IDModel{ get; set; }

    //[more properties...]

    //Navigation Properties
    public Category {get; set;}
}


public class Service
{
    public int Id {get; set;}
    public string Code {get; set;}
    public string Description {get;set;}
}


public class Category
{
    public int Id {get; set;}
    public string Name {get; set;}
}

其实业务逻辑是:

  • If IDModel==0 Then IDcategory 的值指的是 Service
  • 如果 IDModel >0 那么 IDCategory 的值指的是 Category 表。

问题是:我如何将这个业务逻辑转换成 EntityFramework(参见上面的 ssql 示例)?

注意:名称和结构是近似值。

编辑用法示例: 我不能用实体框架做一个例子,因为,这正是我在这里问的,而且我对 C# 比较陌生,所以不能真正帮助这种方式。 但我可以发布我的实际 Ssql 代码来执行该业务逻辑:

SELECT 
CASE reps.idModel 
    WHEN 0 THEN ser.code+ ' - ' + ser.description
    ELSE cat.name
END as 'Product'
FROM Repairs reps
LEFT OUTER JOIN Service ser on ser.id=reps.IDCategory
LEFT OUTER JOIN Category cat on cat.id=reps.IDCategory

希望有帮助!

感谢所有愿意教我如何解决这个问题的人!

解决方法

根据update,这个查询可以和SQL完全一样的写法。除非您定义适当的导航属性,这可以简化查询并删除显式连接。

var query = 
    from reps in ctx.Repairs
    join ser in ctx.Service on reps.IDCategory equals ser.Id into sj
    from ser in sj.DefaultIfEmpty()
    join cat in ctx.Category on reps.IDCategory equals cat.Id into cj
    from cat in cj.DefaultIfEmpty()
    select new
    {
        Product = reps.IDModel == 0 ? ser.Code + " - " + ser.Description : cat.Name
    };