在LINQ查询中将枚举转换为字符串时出错

Jon*_*ood 3 c# linq sql-server entity-framework

我有以下查询,它使用实体框架.

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();
Run Code Online (Sandbox Code Playgroud)

在运行时,我收到以下错误:

LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为存储表达式.

a.Marker是一个字符串列,AnalyticMarker.EmailProposalUrl是一个枚举值,我想将该列与该枚举的名称进行比较.

我知道SQL不支持从枚举到字符串的转换,但为什么它不会解析此字符串的值,然后将生成的字符串传递给SQL?这应该工作得很好.

Har*_*til 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();
Run Code Online (Sandbox Code Playgroud)

另一个答案是解释为什么这也可以起作用的原因.

问题出现是因为ToString()没有真正执行,它被转换为MethodGroup然后解析并转换为SQL.由于没有ToString()等价物,表达式失败.

  • 我正在考虑按照你的建议单独定义字符串,但我有几个这样的,看起来有点尴尬。我不明白的是,为什么 LINQ 不够聪明,无法在构造 SQL 之前解析它在 C# 中可以解析的内容,类似于 C# 编译器如何在生成代码之前解析它可以解析的常量表达式。 (2认同)