【问题标题】:How to get data related to sets of different combinations dynamically如何动态获取与不同组合集相关的数据
【发布时间】:2016-11-07 14:30:18
【问题描述】:

我想获取与不同组合集相关的数据。

前:

如果我有桌子:EmployeeLocation

empNum  locationId  extensionId  year

 534      CX1         AX         2015
 534      LM1         RQ         2015
 677      LM1         ST         2015

回复:534,2015

现在我想查询位于位置 (CX1 AND LM1) 的所有员工,他们都在 2015。也许我将组合更改为 (CX1 AND LM1 AND LR3)... 等等。


如何使这样的东西成为动态组合。根据用户输入的一组位置组合。

【问题讨论】:

  • @IvanStoev Contains = IN 这不是我想要的,例如我想要CX1 AND LM1
  • 我不确定问题在问什么...这是在寻找动态查询吗?
  • @AnynameDonotcare 是的,我在发表评论后意识到,这就是评论被删除的原因。您使用的是什么 ORM - EF 或?
  • @IvanStoev : 对于这部分,没有ORM 只是ado.net ,所以如果我可以通过sql queryLINQ 来做这将是可以接受的

标签: c# sql asp.net linq informix


【解决方案1】:

您可以在 Linq 中使用的方法如下。

假设你有一个类如下:

private class EmployeeLocation {
    public int EmpNum {get; set;} 
    public string LocationId {get; set;}
    public string ExtensionId {get; set;}
    public int Year {get; set;} 
}

您可以创建一个方法来根据输入中提供的参数处理搜索:

public IEnumerable<EmployeeLocation> Search(
    int[] empNumArray, 
    string[] locationIdArray, 
    string[] extensionIdArray, 
    int[] yearArray){

    IEnumerable<EmployeeLocation> result = EmployeeLocationList;
    if (empNumArray != null){
        foreach(var empNum in empNumArray){
            result = result.Where(r => r.EmpNum == empNum);
        }
    }
    if (locationIdArray != null){
        foreach(var locationId in locationIdArray){
            result = result.Where(r => r.LocationId);
        }
    }
    if (extensionIdArray != null){
        foreach(var extensionId in extensionIdArray){
            result = result.Where(r => r.ExtensionId == extensionId);
        }
    }
    if (yearArray != null){
        foreach(var year in yearArray ){
            result = result.Where(r => r.Year == year);
        }
    }
    return result;
}

【讨论】:

  • 包含 = 并且我不想要(或)我想要(和)
  • 一个相同的值(例如r.LocationId)不能等于其他几个值(您的数组循环产生的值),因此结果将始终为空。
【解决方案2】:

检查每个条件然后取结果的交集怎么样?

    public IEnumerable<int> Search(IEnumerable<Employee> employees, IEnumerable<Condition> conditions) {
        var subresults = new List<IEnumerable<int>>();
        IEnumerable<int> result = null;
        foreach (var condition in conditions) {
            subresults.add(employees.Where(e => e.CheckCondition(condition)).Select(e => e.EmpNum));
        }
        foreach (var subresult in subresults) {
            if (result == null) {
                result = subresult;
            } else {
                result = result.Intersect(subresult)
            }
        }
        return result;
    }

【讨论】:

    【解决方案3】:
    DECLARE
         locationId VARCHAR(3);
         year INTEGER;
    
    BEGIN
      EXECUTE IMMEDIATE    
    
        'SELECT empNum FROM EmployeeLocation
         WHERE locationId = CX1 AND locationId = LM1 AND year = 2015';
    END;
    

    这可能是描述查询的一种简单方式。我认为剩下的就是一个事件处理程序来指定使用哪个locationId

    这里更详细:

    CREATE OR REPLACE PROCEDURE empNum(locId VARCHAR(3), yr VARCHAR(4)) IS
       TYPE cur_typ IS REF CURSOR;
       c cur_typ;
       locationId VARCHAR(3);
       year INTEGER;
    BEGIN
      EXECUTE IMMEDIATE    
    
        'SELECT empNum FROM EmployeeLocation
         WHERE locationId = locId AND locationId = locId AND year = yr';
    END;
    

    我认为使用 cur_type 作为参考游标可以用于查询字符串。

    来源:https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg09dyn.htm

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多