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

4 回答 4

1

两种选择——

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

实体框架查询提供者必须知道如何将方法调用转换为 SQL,虽然您可以开发自己的方法,但我认为您不能将它们的子类化——因此向其中添加您自己的方法并不容易。或者,换句话说,非常困难!

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

于 2012-07-05T10:15:54.387 回答
0

You can use:

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

beside that if you want to fetch only one entry you should use

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

or

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

In case of more than one Administrator with username "test" Where will cause exception

于 2012-07-05T10:12:51.730 回答
0

尝试这个

Administrator admin = (from a in db.Administrators where a.Username == "test" select a).FirstOrDefault();
于 2012-07-05T10:16:34.620 回答
-1

使用EntityFunctions类中的方法。

于 2012-07-05T10:11:12.593 回答