Linq to Entities,Take(3)from Joined table

时间:2012-12-04 20:21:07

标签: linq linq-to-entities

我正在尝试使用与子表连接的父表中的数据填充MVC应用程序中的ViewModel。我想从子表中获得的唯一数据是来自前三个记录的Nomenclature字段的逗号稀释字符串,并将它们放入ViewModel中的字符串字段中。这是我尝试过的没有成功的事情:

public IEnumerable<ReqHeaderVM> GetOpenReqs(string siteCode)
    {
      var openReqs = from h in context.ReqHeaders
      join l in context.ReqLineItems on h.ID equals l.ReqID into reqLineItems
       select new ReqHeaderVM
       {
         ReqID = h.ID,
         ShopCode = h.ShopCode
         Nomenclatures = reqLineItems.Select(x => x.Nomenclature).Take(3) // This doesn't work

       };
        return (openReqs.ToList());
    }     

这是ViewMdel:

    public class ReqHeaderVM
{
    [Editable(false)]
    public string ReqID { get; set; }
    public string ShopCode { get; set; }
    public string  Nomenclatures {get; set;}


}

2 个答案:

答案 0 :(得分:1)

假设你在ReqHeaders和ReqLineItems之间有正确的关系(外键),这应该会给你你想要的东西......

public IEnumerable<ReqHeaderVM> GetOpenReqs(string siteCode)
{
    var openReqs = from h in context.ReqHeaders
                    select new
                    {
                        ReqID = h.ID,
                        ShopCode = h.ShopCode
                        Nomenclatures = h.ReqLineItems
                            .OrderBy(x => x.SomeColumn)
                            .Select(x => x.Nomenclature)
                            .Take(3)
                    };

    var openReqsTran = from oreq in openReqs.AsEnumerable()
                        select new ReqHeaderVM
                        {
                            oreq.ReqID,
                            oreq.ShopCode,
                            Nomenclatures = string.Join(", ", oreq.Nomenclatures)

                        };

    return (openReqsTran);
}     

请注意,Nomenclatures是一个命名类型列表。

答案 1 :(得分:0)

是的,连接会创建一个笛卡尔结果集。 (想想表格数据)你想要做什么。要获得您想要的结果,您可以做出一些选择。

  1. 使用延迟加载并迭代查询订单项的每个标题。
    1. 亲 - 简单查询
    2. con - 选择n + 1
  2. 查询所有标题和所有订单项,但构建仅包含前3位的视图模型
    1. 亲 - 单一查询
    2. con - 大型笛卡尔结果集查询太多数据
  3. 查询所有标题和所有关联的行个人
    1. pro - 2个更小,更简单的查询
    2. 查询太多行详细信息。
  4. 在2个查询中查询每个标头的所有标头和前3行
    1. pro - 仅获取您需要的信息
    2. con - 每个标题前3行的复杂查询。