微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个特别的要求。 我正在使用没有关系的现有数据库,我无法更改数据库结构或表,因此我仅通过 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
    };

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。