3

我刚刚开始使用 Linq 和 Linq to Entity Framewok。最重要的是 .NET Ria 服务。我的问题是我有 2 个表 Folder 和 Item 使用第三个“连接”表 FolderItem 具有多对多关系,如下所示:( 来源:InsomniacGeek.com

在 .NET RIA Service 域服务中,我想创建一个返回给定 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 表达式转换为类型“字符串”,因为它不是委托类型

这样做的正确方法是什么(与关联)?

我可以以某种方式使用 .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;
  }

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

4

2 回答 2

4

您的 GetItems 对我来说看起来不错。你也可以这样做:

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

两者都应该返回相同的东西。

于 2009-09-03T18:50:07.343 回答
2

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

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; 
     }
}
于 2009-12-07T00:23:41.867 回答