【问题标题】:Dynamic Take in LINQ to Entities?动态获取 LINQ to Entity?
【发布时间】:2011-09-19 08:43:35
【问题描述】:

假设我有以下表格:

Category: ID, Name, Limit
News: ID, Title
Relation: CID, NID

我想从带有 CID、CName 的新闻表中选择顶部的“x”新闻,并且“x”取决于 Category.Limit。例如

Category

ID        Name         Limit
1         A            2
2         B            3

News

ID        Title
1         News 1
2         News 2
3         News 3
4         News 4

Relation

CID       NID
1         1
1         2
1         3
2         4
2         3
2         2
2         1

那么我们就会得到结果:

CID          CName        NID          NTitle

1            A            1            News 1
1            A            2            News 2
2            B            4            News 4
2            B            3            News 3
2            B            2            News 2

是否可以仅使用 1 个 linq 查询来实现结果?如果不是,那么存储过程?

任何帮助将不胜感激!

【问题讨论】:

    标签: sql-server linq dynamic data-retrieval


    【解决方案1】:

    如果我理解正确,对于每个类别,您都希望拥有第一个 x 新闻,其中 x 是该类别的限制。

    var result = context.Categories
                        .SelectMany(c => c.News
                                          .Take(c.Limit)
                                          .Select(n => new
                                                       {
                                                           CID = c.CID, 
                                                           CName = c.CName,
                                                           NID = n.NID,
                                                           NTitle = n.NTitle
                                                       }));
    

    此答案假定Category 实体包含导航属性News,其中包含属于某个类别的所有新闻。

    【讨论】:

    • 感谢您的回答,但Category 中没有导航属性。 CategoryNews 之间的关系存储在Relation 表中
    • 我用EF,我用一个表(Relation)来存储表之间的关系。
    • 但是在你的实体中不应该有一个名为 Relation 的实体。通常,纯映射表在 EF 中实现为导航属性,即您的新闻实体应该有一个包含类别列表的属性,反之亦然。请检查这个。
    • 是的,我知道,所以我删除了所有约束。没有FK
    • @ByulTaeng:你为什么要那样做?!导航属性是对你的帮助,而不是你需要阻止的东西。
    猜你喜欢
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2010-09-23
    相关资源
    最近更新 更多