【问题标题】:entity framework, how to use object query with a WHERE, AND to retrieve entity record实体框架,如何使用带有 WHERE 的对象查询,以及检索实体记录
【发布时间】:2014-06-24 14:57:22
【问题描述】:

我正在尝试向我的实体框架 where 子句添加 AND 条件,但我这样做的方式不起作用。谁能告诉我如何以正确的方式做到这一点?在添加 AND 条件之前,代码运行良好。

Dim myRecipeStepsHistory = myContext.RefineRecipeStep.Where("it.Recipe_Id=" & strRecipeId And "it.IngredientItemNumber=" & strIngredientNumber).FirstOrDefault()

我得到的错误是:

从字符串“it.Recipe_Id=11”到类型“Long”的转换无效。

非常感谢。

【问题讨论】:

    标签: asp.net .net vb.net entity-framework


    【解决方案1】:

    如果可以的话,我会尝试使用内置的 linq。它将在编译时为您检查您的值,并且您不会在运行时遇到令人讨厌的意外。您当然可以使用魔术字符串,但为什么不使用 ORM 的最佳功能之一呢?想象一下更新一个表字段类型,编译器会自动让你知道你需要更新代码的每个地方。而不是忘记一个然后让它在这里和那里崩溃。

    如果您要查询单个表,通常将“wheres”放在 FirstOrDefault() 中会更容易;

    Dim myRecipeStepsHistory = 
    
    myContext.RefineRecipeStep
             .FirstOrDefault(x => x.Recipe_Id.Equals(strRecipeId) &&
                                  x.IngredientItemNumber == strIngredientNumber);
    
    if(myRecipeStepHistory != null)
    {
         // 
    }
    

    您可能必须转换您的值,使其与 Recipe_Id 和 IngredientItemNumber 的正确数据类型相匹配。

    【讨论】:

    • 嗨彼得,你能告诉我代码在 vb.net 中的样子吗?我的代码中的 x 是什么?我问是因为我使用了代码转换器,这就是我得到的,我不确定它是否正确: Dim myRecipeStepsHistory = myContext.RefineRecipeStep.FirstOrDefault(Function(x) x.Recipe_Id.Equals(strRecipeId) AndAlso x.IngredientItemNumber = strIngredientNumber ) 谢谢
    • 我尝试运行它,但出现语法错误。我用它替换了 x 但它不喜欢它:/
    • @itortu 您应该将字符串转换为适当的类型,并且(我认为)在 VB.Net 中您可以只使用 Dim myRecipeStepsHistory = myContext.RefineRecipeStep.FirstOrDefault(Function(x) x.Recipe_Id = recipeId还有 x.IngredientItemNumber = 成分编号)。这假设您将字符串转换为名为 recipeId 和 ingredientsNumber 的变量。
    • 嗨,itortu,抱歉昨晚离线。很高兴你把它整理好了。
    【解决方案2】:

    可能是缺少空格和/或“错位”:

    Dim myRecipeStepsHistory = myContext.RefineRecipeStep.Where("it.Recipe_Id=" & strRecipeId.ToString() & " And it.IngredientItemNumber=" & strIngredientNumber.ToString()).FirstOrDefault() 
    

    【讨论】:

    • 我尝试了您的建议,但出现了一个新错误:参数类型“Edm.String”和“Edm.Int32”与此操作不兼容。接近等于表达式,第 6 行,第 44 列。指向行: Dim myRecipeStepsHistory = myContext.RefineRecipeStep.Where("it.Recipe_Id=" & strRecipeId & " And it.IngredientItemNumber=" & strIngredientNumber).FirstOrDefault()
    • 哪一个错误?我编辑我的语法以使用 .ToString()
    • Recipe_Id 是数据库中的 int 数据类型,并且 IngredientNumber 是 nvarchar(20)。该行如下所示: Dim myRecipeStepsHistory = myContext.RefineRecipeStep.Where("it.Recipe_Id=" & CType(strRecipeId, Int32) & " And it.IngredientItemNumber=" & strIngredientNumber.ToString()).FirstOrDefault() 错误:参数类型“Edm.String”和“Edm.Int32”与此操作不兼容。近似等于表达式,第 6 行,第 44 列。
    【解决方案3】:

    大概,如果您使用的是 EF,您的模型已经知道 RefineRecipeStep,因此您不应该像那样编写 sql 吗?

    因此,您想要的变得更像:

    Dim myRecipeStepsHistory = myContext.RefineRecipeStep
      .Where((it) => it.Recipe_Id.Equals(recipeId))
      .Where((it) => it.IngredientItemNumber.Equals(ingredientNumber))
      .FirstOrDefault()
    

    或者可能:

    Dim myRecipeStepsHistory = myContext.RefineRecipeStep
      .Where((it) => it.Recipe.Id.Equals(recipeId))
      .Where((it) => it.IngredientItemNumber.Equals(ingredientNumber))
      .FirstOrDefault()
    

    如果配方是已知关系...

    【讨论】:

    • 我尝试了您的两个建议,但我得到:')' 预期,紧随其后:FirstOrDefault() 但添加额外的括号并不能更正它。 Dim myRecipeStepsHistory = myContext.RefineRecipeStep.Where((it) >= it.Recipe_Id.Equals(strRecipeId).Where((it) >= it.IngredientItemNumber.Equals(strIngredientNumber)).FirstOrDefault()) 你能看到问题出在哪里吗可能是?
    • 哎呀,添加了缺少的括号!
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多