LINQ to Entities 无法识别方法“Int32 Parse(System.String)”方法,并且该方法无法转换为存储表达式

Posted

技术标签:

【中文标题】LINQ to Entities 无法识别方法“Int32 Parse(System.String)”方法,并且该方法无法转换为存储表达式【英文标题】:LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression 【发布时间】:2014-06-06 07:01:30 【问题描述】:

我正在使用实体框架,并且我有一行代码正在获取一个 var 并将其转换回数据库的 iint。

var record = context.enrollments.SingleOrDefault
  (row => row.userId == int.Parse(UserID) && row.classId == int.Parse(ClassID));

每当我尝试运行它时,我都会收到 rhis 错误。 “LINQ to Entities 无法识别方法 'Int32 Parse(System.String)' 方法,并且该方法无法转换为存储表达式。”

我也试过了

 var record = context.enrollments.FirstOrDefault
  (row => row.userId == Convert.ToInt32(UserID) 
  && row.classId == Convert.ToInt32(ClassID));

我收到的只是这条错误消息,“LINQ to Entities 无法识别方法 'Int32 ToInt32(System.String)' 方法,并且该方法无法转换为存储表达式

最后我也尝试了这个,我知道这很不寻常,但它在过去类似的情况下也有效。

var record = context.enrollments.SingleOrDefault
  (row => row.userId == CommonDLL.Sanitize<int>.ConvertType(UserID) 
  && row.classId == CommonDLL.Sanitize<int>.ConvertType(ClassID));

我在其中收到此错误。如您所见,我尝试了几种不同的方法,但没有任何效果,所以任何帮助都会很棒。

【问题讨论】:

如果我没记错的话,您应该可以将int.Parse 替换为Convert.ToInt32 以使其工作。 我应该在 cmets 中提到这一点,但我已经尝试过了,我收到此错误消息,“”LINQ to Entities 无法识别方法 'Int32 ToInt32(System.String)' 方法,并且这个方法不能翻译成商店表达式。"" 您是否尝试过使用像System.Convert.ToInt32 这样的完整命名空间?如果这是 linq 不支持的具体内容,我不会。只是在这里猜测。 其实已经有一个关于这个的问题,有一个答案:***.com/questions/7399602/…这里***.com/questions/13887296/… 【参考方案1】:

Linq to Entity 中,您应该使用provider 支持的query 中的方法将它们转换为expression tree 以在您的Data Base 端运行。

默认情况下,所有提供程序都必须支持某些称为Canonical Functions (Read More Here) 的方法,您也可以将user defined functionstored procedure 定义为edm functions 以在linq query (Read More Here) 中使用和(Here)。

此外,您可以使用提供者支持的方法,并且可以转换为EntityFunctions 和SqlFunctions 中的expression tree

最后关于您的问题,您可以在查询之前转换UserIDClassID,如下所示:

var UID = int.Parse(UserID);
var CID = int.Parse(ClassID);
var record = context.enrollments.SingleOrDefault
    (row => row.userId == UID && row.classId == CID);

【讨论】:

谢谢阿米尔。我在这个问题上停留了很长一段时间,在其他任何地方都找不到答案。【参考方案2】:

这对我有用:

  var iId = int.Parse(TextBox1.Text);
 var item = db.Items.Where(p => p.ItemID == iId ).FirstOrDefault();

要实现这一点,您应该在 lambda 表达式之外转换您的文本框值。

【讨论】:

【参考方案3】:

你可以使用AsEnumerable()如下:

var record = context.enrollments.AsEnumerable().FirstOrDefault(row => row.userId == Convert.ToInt32(UserID) && row.classId == Convert.ToInt32(ClassID));

【讨论】:

已有有效答案,而您的答案无效,代码无效,正如您在其他评论中看到的那样? 对不起,非常糟糕的解决方案,context.enrollments.AsEnumerable() 将所有数据拉入内存,然后只选择一个。小心这个AsEnumerable()“修复”。

以上是关于LINQ to Entities 无法识别方法“Int32 Parse(System.String)”方法,并且该方法无法转换为存储表达式的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities 无法识别方法“布尔包含 [Int32]

LINQ to Entities 无法识别方法 IsNullOrWhiteSpace

错误:LINQ to Entities 无法识别方法 DataLength

LINQ To Entities 无法识别方法 Last。真的吗?

LINQ To Entities 无法识别方法 Last。真的吗?

C# LINQ to Entities 无法识别方法“布尔”