5

EntityFrameworkを使用している次のクエリがあります。

Analytic firstSent = (from a in Repository.Query<Analytic>()
                      where a.EntityType == "Proposal" &&
                      a.EntityId == Program.ActiveProposal.Id &&
                      a.Marker == AnalyticMarker.EmailProposalUrl.ToString()
                      orderby a.TimestampUtc
                      select a).FirstOrDefault();

実行時に、次のエラーが発生します。

LINQ to Entitiesは、メソッド'System.String ToString()'メソッドを認識せず、このメソッドをストア式に変換できません。

a.Markerは文字列列でありAnalyticMarker.EmailProposalUrl、列挙型の値です。その列をその列挙型の名前と比較したいと思います。

列挙型から文字列への変換がSQLでサポートされていないことは理解していますが、なぜこの文字列の値を解決してから、結果の文字列をSQLに渡さないのでしょうか。それはうまくいくはずです。

4

2 に答える 2

5

これを試して:

var emailProposalUrl = AnalyticMarker.EmailProposalUrl.ToString();
Analytic firstSent = (from a in Repository.Query<Analytic>()
                      where a.EntityType == "Proposal" &&
                      a.EntityId == Program.ActiveProposal.Id &&
                      a.Marker == emailProposalUrl
                      orderby a.TimestampUtc
                      select a).FirstOrDefault();

この他の答えは、これがうまくいく理由を説明しています。

この問題はToString()、実際には実行されておらず、MethodGroupに変換されてから、解析されてSQLに変換されるために発生します。ToString()同等のものがないため、式は失敗します。

于 2013-01-28T20:26:03.337 に答える
0

さて、C#が通常tostringを解決する場所では、通常はオブジェクトを取ります。ここでは、たとえば、文字列を列挙型と比較するように要求しています。C#はtostring()を呼び出すことができますが、そうするのは正しくありません。

列挙型ではなく、比較しようとしていたのがintであったかどうかを考えてください。数字の1と文字列を比較することはできません。(まあ、できますが、それは仮定を含みます。それがポイントです。言語は、ロジックをもう少し明確にするようにあなたを促そうとしているだけです)

于 2013-01-28T20:48:34.700 に答える