asp.net mvc中的LINQ + EntityFunctions

时间:2013-05-14 08:57:26

标签: c# entity-framework asp.net-mvc-4

我有使用EntityFramework Alpha3(来自nuget)的代码:

class Member
{
    [Key]
    public int Key { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }
    public string Sitename { get; set; }
    public DateTime? RegDate { get; set; }
}

class MembersContext : DbContext
{
    public MembersContext()
        : base("Name=ConnectionString")
    {
    }

    public DbSet<Member> Members { get; set; }
}

public class HomeController : Controller
{
    //
    // GET: /Home/

    public ActionResult Index()
    {

        Database.SetInitializer<MembersContext>(null);
        const int memberKey = 1001;
        using (var db = new MembersContext())
        {
            var query = from m in db.Members
                        where
                            m.Key == memberKey
                            && EntityFunctions.DiffDays(m.RegDate, DateTime.Now) > 0
                        select m;


            var member = query.FirstOrDefault();
        }

        return View();
    }
}

我尝试在新的ASP.NET MVC项目中使用EntityFunctions(基于.net 4.5) - 它总是失败并出现错误:

LINQ to Entities does not recognize the method 'System.Nullable`1[System.Int32] DiffDays(System.Nullable`1[System.DateTime], System.Nullable`1[System.DateTime])' method, and this method cannot be translated into a store expression.

相同的代码在Console应用程序中完全正常。有什么想法,有什么不对?

3 个答案:

答案 0 :(得分:7)

我怀疑对于您的ASP.NET应用,您还引用了System.Data.Entity,并且您使用的是EntityFunctions类定义的System.Data.Entity

但是,Entity Framework 6已删除对System.Data.Entity的依赖,并在EntityFramework程序集内为此目的重新定义了所有必需的类。

这意味着,对于您的控制台应用程序,我猜测是按设计(System.Data.Entity未引用)或偶然(System.Data.Entity被引用但是EntityFunctions类取自EntityFramework.dll),EntityFunctions的正确版本(来自EntityFramework.dll)。

如果您使用的是任何版本的Entity Framework 6,请确保使用EntityFunctions中可以找到的EntityFramework.dll类,而不是System.Data.Entity中的类。 Source code of EntityFunctions.cs in Entity Framework 6

实际上,如果您使用Entity Framework 6,我建议删除对System.Data.Entity的所有引用和任何引用 - 以避免将来出现任何混淆和错误。

答案 1 :(得分:0)

您收到此错误的原因是设计Linq to Entities将所有表达式转换为服务器查询。所以它不知道如何将DiffDays转换为SQL。尝试省略此方法并重写表达式。


更新:

EntityFunctions是Canonical函数,因此您可以use them in Linq to Entities。所以唯一合理的解释是EF Alhpa 版本。

答案 2 :(得分:0)

通过将我所有的 EntityFunctions.TruncateTime 更改为 DbFunctions.TruncateTime 解决了这个问题,并且在检查了各种 using 语句并删除了所有引用 System.Data 的语句后错误消失了。