私はSitecoreの特定の項目のすべてのフィールドを取得するSQLクエリを記述しようとしています。(Sitecoreの)アイテムのすべてのフィールドを取得できますか?
私は立ち往生していると言います。
私はフィールドテーブルに自分自身を参加させる必要があると推測していますが、私は自分自身を結びつけています。
誰もが考えている?
私はSitecoreの特定の項目のすべてのフィールドを取得するSQLクエリを記述しようとしています。(Sitecoreの)アイテムのすべてのフィールドを取得できますか?
私は立ち往生していると言います。
私はフィールドテーブルに自分自身を参加させる必要があると推測していますが、私は自分自身を結びつけています。
誰もが考えている?
を返しません。データベースは時間とともに変化し、これによりコードが破損します。むしろ、Item.Fields
を使用してください。これはすべての必要なフィールドを含むコレクションです。 Item.Fields.ReadAll()を使用するよりも、すべてのフィールドがロードされていることを確認したい場合は(遅延読み込みではなく、本当に読み込まれます)。
編集:クエリーではアイテムを作成することができないので、デフォルト値の動作を見逃し、インテリジェントなSitecoreキャッシングをまったく使用しないことに注意してください。
フィールドを検索する前にSitecore.Context.Item.Fields.ReadAll()
に電話してみてください。
これを行うと、返されるフィールド名はすべてシステムフィールドです。私は、ユーザー定義テンプレートフィールド名を取得する方法があることを望んでいた。 – BraveNewMath
最初の試行が、すべてのフィールドあなたはサイトコアデータベースを自分で照会してみてください例なしで
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
これは正常に動作するようですが、私はまだ私が探していた正確な値を見つけることができませんでした。アイテムから 選択値 I WITH(NOLOCK)内にI.TemplateID = T.IDの項目Tに参加 内側はF.ItemIdのフィールドFに参加 =インナーF.FieldId = FN上FNアイテムを結合I.ID .ID I.templateID = '{xxxxxxx}' とFN.Name = '説明' – Netferret
item.Fieldsを呼び出すと、テンプレートに指定したアイテムフィールドと、すべてのアイテムに存在するSitecore標準フィールドが取得されます。テンプレートで定義したフィールドのみが必要な場合は、以下のコードを使用してください。もちろん、これはフィールド名が「__」で始まらないことを前提としています。
// 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);
}
}
私はこの問題を自分で見てきましたが、基本的には同じソリューションを使用していますが、Linqを使ってforeachに「__」のチェックを入れました foreach(fieldCollection.Where(x = !x.Name.StartsWith( "__"))) あなたはどう思いますか?より良い、悪い、より速い実行? –
遅延読み込みを実行したい。これを解決する方法を教えてください? –