【问题标题】:How to emulate case-when for linq?如何模拟 linq 的 case-when?
【发布时间】:2019-10-02 20:31:33
【问题描述】:
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 出现在两个结构不兼容的初始化中 在单个 LINQ to Entities 查询中。一个类型可以在 同一查询中的两个位置,但前提是设置了相同的属性 在这两个地方,并且这些属性的设置顺序相同。

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

在 sql 中是这样的

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

如果我想返回 IQueryable,linq 是否存在一些解决方法?

【问题讨论】:

  • d in deletableTable ? true : false 在您的查询中出现在哪里?您的代码似乎没有显示任何可能产生该错误的内容。
  • @NetMage你说得对我错过了重要的细节,但当时我不知道这很重要,我已经解决了这个问题,查看答案了解详情

标签: c# sql linq entity-framework-6


【解决方案1】:

问题中的错误消息是因为可查询 a 和可查询 b 中缺少可删除的。

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;

getAgetB 最初返回的对象具有属性prop

如果你想做 from ab in a.Union(b) select deletable = 12 ,即使你的代码中的 uf 12 它是常量,deletable 字段应该在可查询的 a 和可查询的 b 中声明,否则你会出现问题的错误。

我添加了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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多