LINQ to Entities无法识别该方法

时间:2012-07-05 10:08:58

标签: c# entity-framework .net-4.0

我很好奇执行包含Entity Framework不支持的SQL不支持的方法/函数的查询的最佳做法。

例如:

DataContext db = new DataContext();
Administrator admin = db.Administrators.Where(admin => admin.Username.ToString() == "test");

无效,因为方法ToLower()没有受支持的SQL转化。

目前我这样做:

DataContext db = new DataContext();
Administrator admin = db.Administrators.ToArray().Where(admin => admin.Username.ToString() == "test");

但是我不认为将管理员设置转换为数组来执行这些类型的查询是非常好的性能。

有人可以告诉我Entity Framework中这类查询的最佳做法是什么?

谢谢, 亚历克斯。

4 个答案:

答案 0 :(得分:1)

两种选择 -

  • 编写存储过程并导入
  • 使用ToArray()将结果推送到内存中,然后您可以使用所需的所有方法(除非初始结果集很小,否则效果不佳)。

实体框架查询提供程序必须知道如何将方法调用转换为SQL,而您可以开发自己的方法,我认为您不能将它们子类化 - 因此添加自己的方法并不容易。或者,换句话说,血腥难!

它可能非常不受欢迎,但是当我了解数据查询的真正细节时,我仍然使用了很多SP。虽然我环境中的部分动机是其他非EF环境是否需要能够重现类似的行为。

答案 1 :(得分:0)

您可以使用:

DataContext db = new DataContext();
Administrator admin = db.Administrators.Where(admin => admin.Username.Equals("test", StringComparison.InvariantCultureIgnoreCase));

除此之外,如果您只想获取一个条目,则应使用

DataContext db = new DataContext();
Administrator admin = db.Administrators.SingleOrDefault(admin => admin.Username.Equals("test", StringComparison.InvariantCultureIgnoreCase));

DataContext db = new DataContext();
var admins = db.Administrators.Where(admin => admin.Username.Equals("test", StringComparison.InvariantCultureIgnoreCase));
var admin = admins.First();

如果多个管理员使用用户名“test”,哪里会导致异常

答案 2 :(得分:0)

试试这个

Administrator admin = (from a in db.Administrators where a.Username == "test" select a).FirstOrDefault();

答案 3 :(得分:-1)

使用EntityFunctions类中的方法。