linq时如何模拟大小写?

时间:2019-05-15 16:18:55

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

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时,由于d in deletableTable ? true : false,它无法构建sql字符串。

在sql中看起来像

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

如果我想返回IQueryable,是否有linq的解决方法?

1 个答案:

答案 0 :(得分:0)

该问题的错误消息是由于可查询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,也应在querybable a和queryable b中声明deletable字段,否则将出现问题错误。

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