Entity Framework 6 Code First 自定义函数

Posted

技术标签:

【中文标题】Entity Framework 6 Code First 自定义函数【英文标题】:Entity Framework 6 Code First Custom Functions 【发布时间】:2015-04-08 14:31:06 【问题描述】:

我正在尝试类似的事情:

How to use scalar-valued function with linq to entity?

但是我没有使用 EDMX,而是只使用 DbContext 和代码。

我遇到过这个:

https://codefirstfunctions.codeplex.com/

但是用法不合适。我想要实现的是能够做到这一点:

var locations = context.Locations.Where(e => Functions.LatLongDistanceCalc(e.Lat, e.Long, lat, long) >= 10)

它将在 SQL Server 上调用标量函数 (LatLongDistanceCalc)。

有什么方法可以在不使用 EDMX 的情况下做到这一点?我知道您可以构建手动查询,但这并不可取,因为我想通过延迟加载代理等恢复实体,并构建更复杂的查询。

【问题讨论】:

【参考方案1】:

您应该能够在 Where 条件中使用标量 SQL 函数和 CodeFirstStoreFunctions

假设你要映射SQL函数[dbo].[LatLongDistanceCalc],并根据the test suite:

public class MyDataContext: DbContext

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
       //...

       modelBuilder.Conventions.Add(new FunctionsConvention("dbo", this.GetType()));
    

    // "CodeFirstDatabaseSchema" is a convention mandatory schema name
    // "LatLongDistanceCalc" is the name of your function

    [DbFunction("CodeFirstDatabaseSchema", "LatLongDistanceCalc")]
    public static int LatLongDistanceCalc(int fromLat, int fromLong,
                                                       int toLat, int toLong)
    
       // no need to provide an implementation
       throw new NotSupportedException();
    

然后用法是:

context.Locations
       .Where(e => MyDataContext.LatLongDistanceCalc(e.Lat, e.Long, lat, long) >= 10)

【讨论】:

我不知道我怎么没早点得到这个,但这 100% 有效。谢谢你! 我想补充一点,如果您在选择/上下文中,这将有效。如果你在它之外 - 它不会起作用。 我一直在尝试将它与我创建的 Max 函数一起使用,没有输入参数,到目前为止还没有成功。我总是得到 NotSupportedException。 @yopez83 你应该发布一个问题,详细说明你的问题,以便有人可以帮助你 我有一个问题,这个答案不支持这种情况。像这样的sql:select id, dbo.fnDecrypt(seller, 'key123') as Seller from table where dbo.fnDecrypt(seller, 'key123') like '%seller name%', fnDecrypt的第一个参数是varbinary(max ),是使用sql server EncryptByPassPhrase算法得到的结果,类的seller属性是字符串。

以上是关于Entity Framework 6 Code First 自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的两个问题

Entity Framework 6 + Code First + Oracle 12c 的示例

Code First Entity Framework 6化被动为主动之explicit loading模式实战分析( 附源码)

如何使用 Entity Framework 6 Code First 设置默认值约束?

Entity Framework 6 Code First 方法 - 唯一约束不起作用

Entity Framework 6 Code first:如何使用“循环”关系和存储生成的列来播种数据?