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

时间:2013-01-28 20:24:10

标签: c# sql-server linq 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();

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

  

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

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

我知道SQL不支持从枚举到字符串的转换,但是为什么它不会解析此字符串的值然后将结果字符串传递给SQL?这应该可以正常工作。

2 个答案:

答案 0 :(得分: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();

This other answer正在解释为什么这样做也可以发挥作用..

  

问题出现了,因为ToString()并没有真正执行,确实如此   转为MethodGroup,然后解析并转换为SQL。   由于没有ToString()等价物,表达式失败。

答案 1 :(得分:0)

好吧,在C#通常会为你解析tostring的地方,它通常需要一个对象。例如,在这里,您要求它将字符串与枚举进行比较。虽然C#COULD调用tostring(),但它不正确。

考虑一下你是否想要与之比较,而不是枚举。您无法比较数字1和字符串。 (嗯,你可以,但它涉及假设,这是重点;语言只是试图刺激你使逻辑变得更加明确)