5

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

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 回答