代码之家  ›  专栏  ›  技术社区  ›  Nikita

对于linq,如何模拟案例?

  •  0
  • Nikita  · 技术社区  · 7 年前
    IQueryable a;
    IQueryable b;
    
    IQueryable res = from ab in a.Union(b)
    select {
        prop = ab.prop,
        deletable = ab.type == CONSTANT_TYPE && 
        (from d in deletableTable 
         where key = CONSTANT_KEY
         select d).FirstOrDefault().RenderCode == CONSTANT_RENDER_CODE
    };
    return res;
    

    上面的代码会引发错误

    b 出现在两个结构不兼容的初始化中 同一查询中的两个位置,但仅当设置了相同的属性时 在这两个位置,这些属性的设置顺序相同。

    我不确定原因是什么,但我猜,当我返回IQueryable时,它无法构建sql字符串,因为 d in deletableTable ? true : false .

    SELECT 
    case
        when (SELECT TOP 1 code FROM deletable) = CONSTANT then true
        else false
    end
    

    0 回复  |  直到 7 年前
        1
  •  0
  •   Nikita    7 年前

    问题中的错误消息是由于可查询表a和可查询表b中缺少deletable而导致的。

    IQueryable a = getA();
    IQueryable b = getB();
    
    IQueryable res = from ab in a.Union(b)
    select {
        prop = ab.prop,
        deletable = ab.type == CONSTANT_TYPE && 
        (from d in deletableTable 
         where key = CONSTANT_KEY
         select d).FirstOrDefault().RenderCode == CONSTANT_RENDER_CODE
    };
    return res;
    

    getA getB 最初已返回具有属性的对象 prop .

    如果你想做 from ab in a.Union(b) select deletable = 12 deletable

    我已经添加了声明 可删除 要修复错误,请执行以下操作:

    getA() {
        from a ...
        select new {
            prop,
            deletable = false //add field, to use union
        }
    }
    
    getB() {
        from b ...
        select new {
            prop,
            deletable = false //add field, to use union
        }
    }