質問

y、n、dbnullのテキストフィールドを取得し、ブール値に入力する以下のlinqクエリがありますか?フィールドの値に応じて、true、false、またはnullを持つパラメーター。

var dset = from i in tbdc.Talkbacks
       where i.talkback_id == id
       select new Talkback(
               i.talkback_id, i.acad_period, i.reference,
               i.staff_member, i.date_received, i.no_talkers,
               i.gender_id, i.names, i.type_id,
               i.method_id, i.area_id, i.site_id,
               i.category_id, i.date_closed, i.expenddate,
               i.acknowledgementtarget,
               (i.targetmet == "Y") ? true : 
                   ((i.targetmet == "N") ? false : null),
                   (i.acknowledgementtargetmet != "N") ? true : false

問題のある行はです

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? false : null)

読んだ後、私は、同じタイプであるか、暗黙的に互いに変換できる場合、インラインの2番目と3番目の議論がインラインの2番目と3番目の引数が互いに変換されることを示すいくつかのドキュメントを見つけました。

私の質問は、私の希望する結果を達成するためにこの制限をどのように回避できるかということです。

私はC#と比較的新しいので、そのすべての癖/能力にまだ精通していません。

役に立ちましたか?

解決

私の提案は、それを次のように置き換えることです。

(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;

コンパイラがキャストなしで同意しない理由は、それを無効な構造に保存したとしても、結果が暗黙の変換を通じて結果が互換性があるかどうかをチェックするためです。

結果 truefalse として扱われます bool リテラルではありません bool?, 、したがって、暗黙的に変換可能ではありません null. 。どちらかの結果をキャストします bool? それらを同等にします。私が提案したものには、間に暗黙の変換があります bool?null, 、そしてこれも機能します:

(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;

これは、aの間の暗黙の変換です boolbool?. 。私は任意の最初のものを好む。

他のヒント

1つ以上の式を明示的に変換できます bool?:

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top