2009-10-22 28 views

Trả lời

10

Trong không ai trong số các trường hợp bạn đã bao giờ nên cố gắng để truy vấn cơ sở dữ liệu Sitecore mình. Cơ sở dữ liệu thay đổi theo thời gian và điều này sẽ phá vỡ mã của bạn. Thay vào đó, hãy sử dụng Item.Fields. Đây là một bộ sưu tập chứa tất cả các trường cần thiết. Nếu bạn muốn chắc chắn rằng tất cả các trường được nạp (thực sự được tải, không tải xuống), bạn có thể sử dụng Item.Fields.ReadAll().

Chỉnh sửa: Ngoài ra, hãy nhớ rằng truy vấn không cho phép bạn tạo một mục, vì vậy bạn bỏ lỡ hành vi của các giá trị mặc định và không sử dụng bộ nhớ cache Sitecore thông minh chút nào.

+0

Tôi muốn tải chậm. bạn có thể vui lòng cho tôi biết cách giải quyết vấn đề này không ?? –

6

Hãy thử gọi Sitecore.Context.Item.Fields.ReadAll() trước khi tìm kiếm một trường.

+0

khi tôi làm điều này tất cả các tên trường được trả về là trường hệ thống. Tôi đã hy vọng có một cách để lấy tên trường mẫu do người dùng xác định. – BraveNewMath

2

nỗ lực đầu tiên, nhưng không trả lại tất cả các lĩnh vực

SELECT I2.Name FROM 
Items AS I 
JOIN UnversionedFields AS UF ON I.ID = UF.ItemId 
JOIN VersionedFields AS V ON I.ID = V.ItemId 
JOIN SharedFields AS S ON I.ID = S.ItemId 
JOIN Items AS I2 ON I2.ID = UF.FieldId OR I2.ID=V.FieldId OR I2.ID = S.FieldId  
WHERE I.ID = '110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9' 
GROUP BY I2.Name 
+0

Điều này dường như làm việc ok, nhưng tôi vẫn không thể tìm thấy giá trị chính xác mà tôi đang tìm kiếm. chọn Value từ mục I VỚI (NOLOCK) bên tham gia Items T trên I.TemplateID = T.ID bên tham gia Fields F trên F.ItemId = I.ID bên tham gia Items Fn trên F.FieldId = FN .ID nơi I.templateID = '{xxxxxxx}' và FN.Name = 'Mô tả' – Netferret

1

Bằng cách gọi mục.Bạn sẽ nhận được các trường mục mà bạn đã chỉ định trong mẫu của mình cũng như trường tiêu chuẩn Sitecore tồn tại trên tất cả các mục. Sử dụng mã bên dưới nếu bạn chỉ muốn các trường mà bạn đã xác định trong các mẫu của mình. Tất nhiên, điều này giả định tên trường của bạn không bắt đầu bằng "__"

// Get Fields directly from the Item 
List<string> fieldNames = new List<string>(); 
item.Fields.ReadAll(); 
FieldCollection fieldCollection = item.Fields; 
foreach (Field field in fieldCollection) 
{ 
    //Use the following check if you do not want 
    //the Sitecore Standard Fields 
    if (!field.Name.StartsWith("__")) 
    { 
     fieldNames.Add(field.Name); 
    } 
} 
+0

Tôi đã nhìn vào vấn đề này bản thân mình và đang sử dụng cơ bản cùng một giải pháp nhưng tôi đã đẩy kiểm tra cho "__" vào foreach bằng cách sử dụng LINQ như vậy foreach (Field field in fieldCollection.Where (x => ! x.Name.StartsWith ("__"))) Bạn nghĩ sao? Tốt hơn, tệ hơn, thực hiện nhanh hơn? –

Các vấn đề liên quan