表值函数在EF中可以作为IQueryable使用吗?

时间:2017-02-21 11:03:45

标签: c# entity-framework

我有一个Table-Value函数,我想在LINQ语句中用作IQueryable。我在DbContext课程中创建了以下内容:

[DbFunction("dbo","MyTableValuedFunction")]
public virtual IQueryable<MyClass> MyFunction(string keyword)
{
    var keywordsParam = new System.Data.Entity.Core.Objects.ObjectParameter("keywords", typeof(string))
    {
        Value = keyword
    };

    return (this as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext
        .CreateQuery<MyClass>("dbo.MyTableValuedFunction(@keywords)", keywordsParam);
}

dbo.MyTableValuedFunction(@keywords)的结果与现有课程相匹配&#34; MyClass&#34;。我希望如何使用此功能的示例:

MyClass example = (from a in dbContext.MyClass
                  join b in dbContext.MyFunction("exampleKeyword")
                      on a.Id equals b.Id
                  join c in dbContext.MyOtherClass
                      on a.SomeId equals c.Id
                  select a);

...但枚举此IEnumerable会引发异常: 'dbo.MyTableValuedFunction' cannot be resolved into a valid type or function.

我尝试将功能简化为一列,并将类型更改为<int>,但这不起作用,所以我不确定这里发生了什么;它是否像TVF没有被正确找到/识别/使用?

我也试过跟随https://weblogs.asp.net/Dixin/EntityFramework.Functions#Table-valued_function并且在偶然的机会中有一些细微的差别,我用以下方法创建了这个函数:     [Function(FunctionType.TableValuedFunction, "MyTableValuedFunction", Schema = "dbo")]

...但我遇到了完全相同的问题。

1 个答案:

答案 0 :(得分:0)

首先,如果您使用this扩展名,则应编写以下代码,而不是编写代码:

[DbFunction("dbo","MyTableValuedFunction")]
public virtual IQueryable<MyClass> MyFunction(string keyword)
{
    var keywordsParam = new System.Data.Entity.Core.Objects.ObjectParameter("keywords", typeof(string))
    {
        Value = keyword
    };

    return (this as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext
        .CreateQuery<MyClass>("[Your DbContext Name].MyFunction(@keywords)", keywordsParam);
}

我认为Linq将C#语法转换为sql语法。但是首先您应该在dbContext中将功能注册为上述链接。