Asp.net 我可以使用实体框架操纵存储过程的内部结构吗

Asp.net 我可以使用实体框架操纵存储过程的内部结构吗,asp.net,entity-framework,Asp.net,Entity Framework,到目前为止,我一直在使用经典的ADO.NET模型进行数据库访问。我得告诉你,我对它很满意。但我最近也听说了很多关于实体框架的事情,所以我想我可以试试。实际上,促使我这么做的主要原因是需要找到一种方法来构建存储过程的WHERE子句。使用经典方法,我必须执行以下任一操作: 基于用户输入在客户端构建WHERE子句,并将其作为VARCHAR2参数发送到存储过程,将WHERE子句与SQL的主要部分连接起来,并将整个字符串传递给EXECUTE_IMMEDIATE函数。我个人不喜欢这样做 在存储过程内部构造大

到目前为止,我一直在使用经典的ADO.NET模型进行数据库访问。我得告诉你,我对它很满意。但我最近也听说了很多关于实体框架的事情,所以我想我可以试试。实际上,促使我这么做的主要原因是需要找到一种方法来构建存储过程的WHERE子句。使用经典方法,我必须执行以下任一操作:

  • 基于用户输入在客户端构建WHERE子句,并将其作为VARCHAR2参数发送到存储过程,将WHERE子句与SQL的主要部分连接起来,并将整个字符串传递给EXECUTE_IMMEDIATE函数。我个人不喜欢这样做
  • 在存储过程内部构造大量的SQL语句,这意味着我必须考虑WHERE子句可能包含的所有可能的组合。这似乎比第一个病例更糟

  • 我知道EF也使使用存储过程成为可能。但是,是否有可能动态构建WHERE部分?EF能拯救我吗?

    是的,你可以在Linq中使用动态查询

  • 以司各特·顾为例

    var query = Northwind.Products.Where("Lastname LIKE "someValue%");
    
    或者一些复杂的查询

    var query =
        db.Customers.
        Where("City = @0 and Orders.Count >= @1", "London", 10).
        OrderBy("CompanyName").
        Select("new(CompanyName as Name, Phone)");
    
    或者从这个答案

    var pr=PredicateBuilder.False();
    foreach(名称中的变量名称)
    {
    pr=pr.Or(x=>x.Name==Name&&x.Username==Name);
    }
    返回query.AsExpandable().Where(pr);
    
    但这只是动态创建查询。我想使用存储过程。@MikeJM尝试为存储过程链接where方法。像这样的。yourContext.yourSPname().Where(这里是您的查询);//只是伪代码,不确定是否有效
    var pr = PredicateBuilder.False<User>();
    foreach (var name in names)
    {
        pr = pr.Or(x => x.Name == name && x.Username == name);
    }
    return query.AsExpandable().Where(pr);