我想创建一个复杂类型,以便在实体管理器中使用动态构造的查询并使用exec()
执行。可能吗?;因为我正在编写一个过滤器,如果不可能,你会做什么呢?
另外,我正在使用linq进行评估,但是过滤器需要许多表及其寄存器,因此效率是一个问题。
谢谢...
答案 0 :(得分:4)
是的,您可以在顶部使用Entity Framework 4和LINQ,它会生成参数化查询并执行它,这是选项。
另一种选择是(我曾多次)创建基类/接口,让我们说:
public interface IExecutable
{
void Execute(IConnection connection);
}
public interface IExecutable<TResult> : IExecutable
{
TResult Result { get; }
}
public abstract ActionBase<TResult> : IExecutable<TResult>
{
protected void AddParameter(....);
protected IDataReader ExecuteAsReader(string query) {
//create a DB Command, open transaction if needed, execute query, return a reader.
}
protected object ExecuteAsScalar(string query) {
//....
}
//the concrete implementation
protected abstract TResult ExecuteInternal();
IExecutable.Execute(IConnection connection) {
//keep the connection
this.Result = ExecuteInternal();
}
//another common logic:
}
然后你可以创建你的具体行动:
public sealed class GetUsersAction : ActionBase<<IList<User>>
{
//just a constructor, you provide it with all the information it neads
//to be able to generate a correct SQL for this specific situation
public GetUsersAction(int departmentId) {
AddParameter("@depId", departmentId);
}
protected override IList<User> ExecuteInternal() {
var command = GenerateYourSqlCommand();
using(var reader = ExecuteAsReader(command)) {
while(reader.Read) {
//create your users from reader
}
}
//return users you have created
}
}
很容易创造具体行动!
然后,为了使它更容易,创建一个ExecutionManager,其关注点是如何获取连接并执行操作:
public sealed ExecutionManager() {
TResult Execute<TResult>(IExecutable<TResult> action) {
var connection = OhOnlyIKnowHowTOGetTheConnectionAnfHereItIs();
action.Execute(connection);
return action.Result;
}
}
现在只需使用它:
var getUsersAction = new GetUsersAction(salesDepartmentId);
//it is not necessary to be a singletone, up to you
var users = ExecutionManager.Instance.Execute(getUsersAction);
//OR, if you think it is not up to ExecutionManager to know about the results:
ExecutionManager.Instance.Execute(getUsersAction);
var users = getUsersAction.Result
使用这种简单的技术,将所有连接/命令/执行逻辑从具体操作转移到基类中非常容易,而具体操作的关注点只是生成SQL并将数据库输出转换为一些有意义的结果。
祝你好运:)答案 1 :(得分:1)
如果您决定采用Linq路线并正在寻找一种好的方法来进行过滤。 LinqKit是一个用于构建临时谓词的很棒的库。内置linq库的问题是你只能ad-hoc组合AND语句,你不能ad-hoc组合OR语句。 Linqkit让这一切变得轻而易举。