【问题标题】:ASP.NET MVC 5 Join on Between, no primary keyASP.NET MVC 5 Join on Between,没有主键
【发布时间】:2015-08-03 12:58:40
【问题描述】:

我有一些有趣的代码要查看。

我有三张桌子:

表 A 有 4 列:

表PK

用户名

表BFKID

分数

表 B 有 3 列:

TablePK

名字

短名称

表 c 有 4 列:

TablePK

最低分数

最大得分

修饰符

所以当完全连接发生时,它看起来像这样:

SELECT  B.ShortName 
      , A.Score
      , C.Modifier
FROM TableA A 
     INNER JOIN TableB B ON a.TablePK= B.TablePK 
     INNER JOIN TableC C ON A.Score BETWEEN C.ScoreMin AND C.ScoreMax

结果如下所示:

短名称、分数、修饰符。例如:

CHA, 19, 4

现在我知道如果存在实际的 PK 或 FK,或者即使只有 0:1 关系,如何进行实体框架连接。

但是当没有PK也没有FK时,你如何进行join呢?

【问题讨论】:

    标签: asp.net sql-server asp.net-mvc entity-framework join


    【解决方案1】:

    LINQ,包括 LINQ to Entities,仅支持等值连接。

    但是你可以直接运行SQL:

    var res = myContext.Database.SqlQuery<TResult>("SQL goes here", parmeters...);
    

    并且 EF 会将结果集的列映射到 TResult 的属性(需要与上下文的其他连接:它不需要是在上下文中具有 DbSet 类型属性的实体类型) .

    【讨论】:

    • 你会在实体模型中这样做吗?还是控制器并将其传递给自定义视图模型?
    • 我根据更广泛的背景在这两种情况下都做过。当然 - 理想情况下 - 它进入了适当分层架构的较低层......但很多应用程序的结构并不理想。
    【解决方案2】:

    在这种情况下,我不会尝试加入它们,只需在您的 linq 中使用子选择从未加入的表中进行选择,其中分数在您想要的范围之间。

    var results = context.TableA
        .Select(a => new  {
            score = a.Score, //add all needed columns
            tableCs = context.TableC.Where(c => a.Score >= c.ScoreMin && a.Score <= c.ScoreMax)
        });
    

    【讨论】:

    • 你会在哪里添加这个?在主实体模型或控制器中并将其传递给新的视图模型?
    • 通常这将在存储库中,然后您将使用它来将结果作为控制器中的视图模型返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2017-09-29
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多