C# 是否在不公开实体框架依赖项/实现详细信息的情况下使用EdmFunctionAttribute?

C# 是否在不公开实体框架依赖项/实现详细信息的情况下使用EdmFunctionAttribute?,c#,entity-framework,.net-4.0,dependencies,C#,Entity Framework,.net 4.0,Dependencies,有没有一种好方法可以利用edmfonfictionattribute,而不引入对实体框架/System.Data.Entity.dll的依赖关系 我想我可以有一个与方法的接口和一个具体的实现,该实现使用EdmFunctionAttribute将方法映射到数据库函数来实现该方法 我在一个程序集中定义了一个上下文接口IMyContext,在另一个程序集中定义了一个实体框架实现MyContext public interface IMyContext { double SomeFunction

有没有一种好方法可以利用
edmfonfictionattribute
,而不引入对实体框架/System.Data.Entity.dll的依赖关系

我想我可以有一个与方法的接口和一个具体的实现,该实现使用
EdmFunctionAttribute
将方法映射到数据库函数来实现该方法

我在一个程序集中定义了一个上下文接口
IMyContext
,在另一个程序集中定义了一个实体框架实现
MyContext

public interface IMyContext
{
    double SomeFunction(double first, double second);

    // other interface details here
}

public partial class MyContext : IMyContext
{
    [EdmFunction("MyNamespace", "MyDatabaseFunction")]
    public double SomeFunction(double first, double second)
    {
        throw new NotSupportedException("This method may only be called as part of a LINQ expression.");
    }

    // rest of interface implementation here
}
我使用工厂(在后台使用StructureMap)获取上下文实例作为接口类型:

using (IMyContext context = ContextFactory.GetNewContext())
{
    var results = context.Table.Select(t => context.SomeFunction(t.Col1, t.Col2)).ToList();
}
这会抛出一个
NotSupportException
,说明LINQ to实体无法识别方法“Double SomeFunction(Double,Double)”

如果我将上下文转换为具体的实现

using (MyContext context = ContextFactory.GetNewContext() as MyContext)
{
    ...
}
然后它工作了,但是我需要指定具体的实现,这是我不想做的

该函数不必是上下文类的成员,我只是将其放在那里进行探索。

您不能在那里使用并公开
IQueryable
接口作为方法,例如:

IQueryable FindAll(Func<T,bool> exp);
IQueryable FindAll(函数表达式);

这是不可能的,因为Linq查询生成器将调查接口类型,而不是具体类。表达式树将包含接口方法的方法引用,当您调查该方法的属性时,它不会返回任何属性

您可以创建表达式访问者,访问表达式树,并将类型从接口更改为具体类型

TypeReplacer tr = new TypeReplacer();
tr.Visit(ex);

class TypeReplacer: ExpressionVisitor{
    protected override MethodCallExpression MethodCall(MethodCallExpression exp)
    {
       // compare exp.Method and 
       // replace it with concrete Type's method
       return exp;
    }
}

我也面临着同样的情况。一、 也希望通过接口引用访问EdmFunctionAttribute时可以解析,但没有用。在处理多个上下文(多个数据库)时会变得更加困难。值得一提的是,我无法解决这个问题,不得不在我的存储库的具体实现中使用DB函数(在您的案例中是上下文),这意味着所有函数调用都必须驻留在我的存储库类中——即:我的客户机代码无法直接访问它。我对它并不感到兴奋,但它是有效的(而且它迫使查询代码驻留在存储库中,有些人会认为它属于存储库)。对不起,您的答案并不能解决问题中尚未实现的任何问题。您的解决方案仍然需要引用具体的上下文类,而不是上下文接口。