我尝试使用linq to sql访问数据库功能。 Herer是我的SQL标量函数:
CREATE FUNCTION Echo(@text NVARCHAR(MAX))
RETURNS NVARCHAR(MAX) AS
BEGIN
RETURN @text;
END;
我创建了一个名为EntityFunction的类来调用Sql Server中的函数:
public static class EntityFunctions
{
[DbFunction("SqlServer", "Echo")]
public static string Echo(string parameter)
{
throw new NotImplementedException();
}
}
这是我的DbContext:
public class MainDbContext : DbContext
{
#region Properties
/// <summary>
/// List of accounts in database.
/// </summary>
public DbSet<Account> Accounts { get; set; }
#endregion
#region Constructor
/// <summary>
/// Initiate context with default settings.
/// </summary>
public MainDbContext() : base(nameof(MainDbContext))
{
}
#endregion
#region Methods
/// <summary>
/// Called when model is being created.
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
base.OnModelCreating(modelBuilder);
}
#endregion
}
一切似乎都很好,但是当我使用这段代码时:
private static void Main(string[] args)
{
var context = new MainDbContext();
var accounts = context.Accounts.Select(x => EntityFunctions.Echo(x.Email)).ToList();
}
应用程序抛出了一个异常:指定的方法&#39; System.String Echo(System.String)&#39;在类型&#39; MySqlEntityFramework.Models.EntityFunctions&#39;无法转换为LINQ to Entities商店表达式
有人可以帮我解决这个问题吗?
谢谢,
答案 0 :(得分:0)
这是使它对我有用的修改。
在OnModelCreating()方法中,添加以下行:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// ...
modelBuilder.Conventions.Add(new FunctionsConvention("dbo", this.GetType()));
}
定义DbFunction存根时,请使用以下属性:
[DbFunction("CodeFirstDatabaseSchema", "Echo")]
public static string Echo(string text)
{
throw new NotSupportedException("Direct calls are not supported.");
}
我从 this link
这是我执行的测试,以查看是否是您遇到的问题:如果我注释掉modelBuilder.Conventions.Add上面的行,则会收到与您收到的错误类似的错误消息。
System.NotSupportedException:无法将类型为“ try1.ExContext”的指定方法“ System.String Echo(System.String)”转换为LINQ to Entities存储表达式。