代码之家  ›  专栏  ›  技术社区  ›  Magnus Johansson

如何在.NET RIA服务中查询LINQ与实体框架之间的关联

  •  3
  • Magnus Johansson  · 技术社区  · 15 年前

    我刚从Linq和Linq to Entity Framewok开始。除此之外,还有.NET RIA服务。 我的问题是我有两个表文件夹和具有多对多关系的项,使用第三个“连接”表文件夹项,如下所示:

    在.NET RIA服务域服务中,我想创建一个返回给定folderID的所有项的方法。

    在T-SQL中,这类似于:

    SELECT * FROM Item i
    INNER JOIN FolderItem fi ON fi.ItemID = i.ID
    WHERE fi.FolderID = 123
    

    我的LINQ知识有限,但我想做这样的事情:

    public IQueryable<Item> GetItems(int folderID)
    {
      return this.Context.Items.Where(it => it.FolderItem.ID == folderID);
    }
    

    这不是正确的语法,它给出了以下错误:

    无法将lambda表达式转换为 键入“string”,因为它不是 委托类型

    正确的方法是什么(关联)?

    我是否可以以某种方式使用.include(“folderitem”)?

    请仅使用方法语法。

    PS。 下面是使用查询表达式的方式:

      public IQueryable<Item> GetItemsByFolderID(int folderID)
      {
        return from it in this.Context.Items
               from fi in it.FolderItem
               where fi.Folder.ID == folderID
               select it;
      }
    

    qeustion是,使用基于方法的查询语法会是什么样子?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Magnus Johansson    15 年前

    我觉得你的衣服不错。你也可以这样做:

    public IQueryable<Item> GetItems(int folderID)
    {
        return this.Context.FolderItems
                           .Where(fi => fi.ID == folderID)
                           .Select(fi => fi.Items);
    }
    

    两者都应该返回相同的内容。

        2
  •  2
  •   Gus    15 年前

    您可以让父实体包含子实体。要做到这一点,你需要做两件事:

    1)更新域查询以包括文件夹项和项:

    return from x in Context.FolderItems
                            .Include("FolderItem")
                            .Include("FolderItem.Item")
           where x.ID == folderID
           select x
    

    2)更新元数据文件,以便RIA服务知道将关联返回给客户机:

    [MetadataTypeAttribute(typeof(FolderMetadata))]
    public partial class Folder
    {
         internal sealed class FolderMetadata
         {
               ...
               [Include]
               public FolderItem FolderItem; 
         }
    }