【问题标题】:Call a Scalar valued function in entity framework 6在实体框架 6 中调用标量值函数
【发布时间】:2015-10-22 03:29:22
【问题描述】:

如何在实体框架 6 中调用标量函数? 我试过下面的代码

        using (MhEntities DContext = new MhEntities())
        {
            var Account_IdParameter = Account_Id.HasValue ? new ObjectParameter("Account_Id", Account_Id) : new ObjectParameter("Account_Id", typeof(long));
            string res = ((IObjectContextAdapter)DContext).ObjectContext.CreateQuery<string>("MoneyforHealthEntities.Fn_LEVEL0_Acount_Id", Account_IdParameter).FirstOrDefault();
            return Convert.ToInt64(res);
        }

【问题讨论】:

  • 运行代码时会发生什么?

标签: c# linq entity-framework


【解决方案1】:

无需使用ObjectContext 来执行此操作。另外,我认为你不能简单地传入函数的名称,你需要给它完整、有效的 SQL。

所以我会尝试这样的事情:

using (MhEntities DContext = new MhEntities())
{
    string res = DContext.Database.SqlQuery<string>("SELECT MoneyforHealthEntities.Fn_LEVEL0_Acount_Id(@p0)", Account_Id).FirstOrDefault();
    return Convert.ToInt64(res);
}

由于您没有提供有关您正在使用的数据库或确切的函数定义的任何详细信息,因此上述内容可能需要进一步调整。但它至少应该给你基本的想法。

【讨论】:

  • 嗨,我使用了字符串 res = DContext.Database.SqlQuery("SELECT [dbo].[Fn_LEVEL0_Acount_Id](@p0)", Account_Id).FirstOrDefault();让它工作。无需使用entities.fn
  • 我在 SQL Server 2008 和 EF 6 上进行了尝试,收到的错误表明必须声明 @p0。 This solution 对我有用。
【解决方案2】:
DateTime ServerTime = new ContextDbEntities().Database.SqlQuery<DateTime>("Select getdate();").FirstOrDefault();
MessageBox.Show(ServerTime.ToString());

【讨论】:

  • “任何让提问者朝着正确方向前进的答案都是有帮助的,但请尝试在答案中提及任何限制、假设或简化。简洁是可以接受的,但更完整的解释会更好。” How to answer
【解决方案3】:

所有答案都对,但如果有人使用stored procedure,则需要在函数导入时通过以下方式对其进行编辑:
1. 右键单击​​您的function,然后单击edit
2.在edit function Import窗口。
3. 在returns a collection 部分选择Scaler
4. 最后,点击确定并保存您的模型。

在我的示例中,我调用了一个返回字符串值的插入存储过程。

using (DbModel db = new DbModel())
 {
     string result = db.storedprocedureName(value1,value2).FirstOrDefault();
     return result;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多