我一直在解决一些 EF 6 代码的异常问题,其中使用 Oracle.ManagedDataAccess.Client 驱动程序运行的查询有时需要几分钟才能返回结果,即使基础查询在 2 毫秒内执行。示例查询如下所示:
var result = users.Where(u => u.username == varUserName).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
这个查询可能需要几分钟才能返回,但是如果我用 lambda 函数中的常量替换相同的查询,它会立即运行:
var result = users.Where(u => u.username == "testUsername").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
要解决此问题,我可以编写参数化 SQL 查询,也可以手动生成适当的 lambda 表达式树:
var userParam = Expression.Parameter(typeof(Entity.User), "user");
var userNameField = Expression.Property(userParam, "username");
var userNameConstant = Expression.Constant(varUserName, typeof(string));
var equalUserName = Expression.Equal(userNameField, userNameConstant);
var lambda = Expression.Lambda<Func<Entity.User, bool>>(equalUserName, new ParameterExpression[] { userParam });
var result = users.Where(lambda).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
因为这有效,所以它引出了一个问题:有没有一种方法可以轻松生成 lambda 表达式树,从而将变量直接包含为常量,而不是对变量的引用?
例如,这样的事情将是理想的:
var lambdaExpression = (u => u.username == varUserName).ReplaceVariablesWithConstants();
Run Code Online (Sandbox Code Playgroud) 我有一个带有表单的页面,它使用@Persist字段作为表单控件(文本框,单选按钮等),这样如果提交表单,如果自定义验证失败,数据将保留在表单中.
从文档中,"标有@Persist的字段可能没有默认值(无论是设置为内联还是设置在构造函数内)".但是,我需要为某些表单元素设置默认值(包括一些@Validate("required")选择框).
实现这个目标的方法是什么?
谢谢