使用方法与属性来使用LINQ从类中检索数据

时间:2010-06-02 15:11:10

标签: c# asp.net linq sitecore

我正在构建一个内容管理的网站,其中包含由我工作的几个开发人员构建的自行开发的API。 API只是Sitecore CMS(在本例中是我们的CMS)和我们用于将数据项绑定到控件的C#代码之间类似LINQ的类似ORM的层。我发现在几个地方我有机会决定创建方法和属性来检索“子项”以获取数据。

为了解释Sitecore术语,假设单词“template”表示代表某种Sitecore类型的自定义类。

// retrieve all children of the Sitecore template "Content Folder" below the PageData section
// assume PageData is an object that represents that section in the Sitecore content tree
public List<ContentFolder> GetContentFolders() {
  return PageData.CurrentItem.ChildrenByTemplate("Content Folder").As(i => new ContentFolder(i));
}

上面的代码将在PageData部分执行一些LINQ以获取“内容文件夹”类型的子项列表。 注意.As()只是一种扩展方法,可以轻松制作该类型的列表。在这个例子中,它显然是一种方法。但是,它应该是公共财产吗? E.g。

public List<ContentFolder> ContentFolders {
  get {
    return PageData.CurrentItem.ChildrenByTemplate("Content Folder").As(i => new ContentFolder(i));
  }
}

哪个更合适?他们是平等的吗?我肯定找到了一个明确的例子,说明何时方法更有意义:我需要传递参数的任何情况或者我可以重载参数的情况。 E.g。

public List<SupportProductItem> GetSupportProductItems() {
  return GetSupportProductItems(true);
}

public List<SupportProductItem> GetSupportProductItems(bool excludeUnsetProducts) {
  var productItems = CurrentItem.ChildrenByTemplate("Support Product Item").As(i => new SupportProductItem(i));

  if(excludeUnsetProducts)
    productItems = productItems.Where(i => i.ProductSelector.IsSet).ToList();

  return productItems;
}

我选择一个方法属性(在我看来)的情况是我只是检查一些简单的东西而不是检索数据列表,例如。

public bool IsSet {
  get {
    return (CurrentItem != null);
  }
}

而不是:

public bool IsSet() {
  return (CurrentItem != null);
}

所以代码看起来像:

...
if(ContentFolder.CurrentItem.IsSet) {
  // code
}
...

在决定使用方法与属性之间时,除了重载和个人偏好之外还有其他事情需要考虑吗?我应该考虑什么“技术性”?

2 个答案:

答案 0 :(得分:4)

适用正常的Properties vs. Methods指南。

答案 1 :(得分:3)

我确信之前已经出现了这个问题,但基本上属于一个属性:

a)相对较快的 b)没有副作用

因此,如果您的查询需要花费大量时间,则应考虑将其放入方法中。否则,房产就好了。