【问题标题】:LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expressionLINQ to Entities 无法识别方法“Int32 Parse(System.String)”方法,并且该方法无法转换为存储表达式
【发布时间】: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 不支持的具体内容,我不会。只是在这里猜测。
  • 其实已经有一个关于这个的问题,有一个答案:stackoverflow.com/questions/7399602/…这里stackoverflow.com/questions/13887296/…

标签: c# linq int entity int32


【解决方案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)。

此外,您可以使用提供者支持的方法,并且可以转换为EntityFunctionsSqlFunctions 中的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()“修复”。
    猜你喜欢
    • 2017-09-08
    • 2012-12-02
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多