7

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番目の引数が同じタイプであるか、暗黙的に相互に変換可能である必要があると述べているドキュメントを見つけました。

私の質問は、この制限を回避して目的の結果を得るにはどうすればよいですか?

私は C# に比較的慣れていないので、そのすべての癖/機能にまだ慣れていません。

4

2 に答える 2

6

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

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

コンパイラがキャストなしで一致しない理由は、それを null 許容構造に格納した場合でも、三項演算が暗黙的な変換によって結果に互換性があるかどうかをチェックするためです。

結果trueとはではなくリテラルfalseとして扱われるため、暗黙的に に変換することはできません。いずれかの結果をキャストすると、それらは比較可能になります。私が提案したものには、 と の間の暗黙的な変換があり、これも機能します。boolbool?nullbool?bool?null

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

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

于 2010-07-05T22:04:35.077 に答える
2

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

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
于 2010-07-05T22:02:13.323 に答える