3

私のモデルには、次の列挙とエンティティが含まれています。

<cf:enumeration name="Language" usePersistenceDefaultValue="false">
  <cf:enumerationValue name="EN" value="1" default="true" />
  <cf:enumerationValue name="NL" value="2" />
  <cf:enumerationValue name="DE" value="3" />
</cf:enumeration>

<cf:entity name="Person"  >
  <cf:property name="Id" key="true" />

  <cf:property name="Languages" typeName="CodeFluent.Runtime.Utilities.PersistentList&lt;Language&gt;">
    <cf:message class="_doc">The languages that the person speaks</cf:message>
  </cf:property>

  <cf:method name="LoadPersonThatSpeaksOneOrMoreLanguages" checkLevel="None" memberAttributes="Public" >
    <cf:body language="tsql" text="load(Language[] languages) from Person where Languages in (@languages)" />
  </cf:method>
</cf:entity>

メソッド LoadPersonThatSpeaksOneOrMoreLanguages は、提供された言語の 1 つ以上を話すすべての人を返す必要があります。このメソッドに対して生成されたストアド プロシージャは正しくないようです:

ALTER PROCEDURE [dbo].[Person_LoadPersonThatSpeaksOneOrMoreLanguages]
(

 @languages [dbo].[cf_type_Person_LoadPersonThatSpeaksOneOrMoreLanguages_0] READONLY,
 @_orderBy0 [nvarchar] (64) = NULL,
 @_orderByDirection0 [bit] = 0
)
AS
SET NOCOUNT ON
DECLARE @_c_languages int; SELECT @_c_languages= COUNT(*) FROM @languages
SELECT DISTINCT [Person].[Person_Id], ... 
    FROM [Person] 
    WHERE [Person].[Person_Languages] IN (((SELECT * FROM @languages)))

質問 1: どうすれば望ましい結果を得ることができますか? Language エンティティを作成し、Person と Language の間に 1:n の関連付けを指定する必要がありますか? 私は言語エンティティを持たないことを好みます。または、Languages プロパティをテーブル値パラメーター ( ) と同じ型に変換する必要があることを指定できますcf_type_Person_LoadPersonThatSpeaksOneOrMoreLanguages_0か?

質問 2: 生成されPersonCollectionたクラスにメソッドが含まれていますLoadPersonThatSpeaksOneOrMoreLanguages。このメソッドのパラメーターの型はLanguage[]です。配列の代わりに、IEnumerable<Language>. XML モデルでこれを指定するにはどうすればよいですか?

4

2 に答える 2

2

質問1

PersistentList、単純な値 (int、string、enum など) のコレクションを格納するように設計されていますが、それらを SQL で直接クエリすることはできません。実際、PersistentListはデータベースの列に変換され、NVARCHARこの列にはEN|NL(パイプで区切られた値) のような値が含まれます。データベース エンジンは、文字列から単一の値を抽出する方法を知りません。cf_SplitString関数を使用して列の値からテーブルを作成し、それを使ってやりたいことができるかもしれませんが、それは最も簡単な解決策ではないようです...

必要に応じて、複数値の列挙を使用できます。

<cf:enumeration name="Language" flags="true">
    <cf:enumerationValue name="Unspecified" /> <!-- value=0 -->
    <cf:enumerationValue name="EN" />          <!-- value=1 -->
    <cf:enumerationValue name="NL" />          <!-- value=2 -->
    <cf:enumerationValue name="FR" />          <!-- value=4 -->
</cf:enumeration>

あなたはそれらを使用することができますCFQL:

-- Load Persons that speak the specified language
LOAD(Languages) WHERE (Languages & @Languages) = @Languages

-- Load Persons that speak at least one of the specified language
LOAD(Languages) WHERE (Languages & @Languages) <> 0

もちろん、最新の可能性は、言語エンティティを作成し、テーブル値パラメーターを使用することです。

http://blog.codefluententities.com/2014/07/16/persistent-list/ http://www.softfluent.com/documentation/Enumerations_Overview.html

質問2

CodeFluent Entitiesの公式ブログから:

ここに画像の説明を入力 ここに画像の説明を入力

于 2015-10-19T18:54:21.317 に答える