在Entity Framework 6中调用标量值函数

8
我该如何在Entity Framework 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);
        }

1
当你运行代码时会发生什么? - GrandMasterFlush
3个回答

14

不需要使用 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<string>("SELECT [dbo].Fn_LEVEL0_Acount_Id", Account_Id).FirstOrDefault(); 使其正常工作。无需使用entities.fn。 - Liju
1
我尝试在SQL Server 2008和EF 6中运行此代码,但是收到了一个错误,指示必须声明@p0。这个解决方案对我有效。 - PBMe_HikeIt

0
DateTime ServerTime = new ContextDbEntities().Database.SqlQuery<DateTime>("Select getdate();").FirstOrDefault();
MessageBox.Show(ServerTime.ToString());

2
任何能让提问者朝着正确方向前进的答案都是有帮助的,但请尽量在回答中提及任何限制、假设或简化。简洁明了是可以接受的,但更充分的解释会更好。 如何回答问题 - ejderuby

0

所有答案都是正确的,但如果有人使用了一个存储过程,需要在函数导入时进行编辑:
1. 右键单击您的函数,然后单击编辑
2. 在编辑函数导入窗口中。
3. 在返回集合部分选择Scaler
4. 最后,单击确定并保存您的模型。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接