select .... Charge=isnull((SELECT Charge=case when cr.isend=1 then '欠费' else '已收' end FROM TCharge tc Where tc.code=t.code),'未收') from task t left join .... left join .... where ....
如上的SQL语句,子查询中如果有结果,返回的是“欠费”或者“已收”,如果没有结果,返回的是null
在sql中返回的结果是这样的,在sql中可以直接识别查询中返回的值,但是在linq中,返回的是一个object,不能直接显示欠费或者已收,linq中的isnull怎么用,我也不知道,这个是linq返回值在页面显示的状态,,所以想请教具体linq该怎么写啊,我是新手。
from t in db.tasks
select new
{
Charge = (
(from tc in db.TCharges
where tc.code == t.code
select (tc.isend == true ? "欠费" : "已收")
).FirstOrDefault()
) ?? "未收"
}
根据你的意思, 应该大概是这样写. 不过严重不推荐这种语法. 你的SQL语句里, 实际上子查询隐含可以返回结果集或是单值两种可能性, 我估计你意思子查询那张表跟task表应该是一一对应的, 所以不会返回结果集, 为了跟你的SQL语句一致, 我在LINQ中加了FirstOrDefault, 但是这种情形下, 最好不用子查询, 而是直接LEFT JOIN在外层查询中.
谢谢,帮助很大
linq中 isnull 情况,可空类型用 Nullable<T>.Equals, 引用类型用Nullable.Equals。
你的好像是子查询,可以考虑 通过 子查询的记录数Count 是否大于0来进行相关逻辑判断
有记录的还分已收跟欠费2种,所以用Count不行
@woalmen:
var query=from t in task let c=charge.FirstOrDefault(w=>w.code==t.code) select new{ charge=(c==null?"未收":c.isend=1? "欠费":"'已收") }
select new {
ul.Id,
ul.UserId,
dj= ul.CashNumber == 5 ? "a" : (ul.CashNumber == 20 ? "b" : "c")
}
这个方式确实能生成sql对应的case语句,但是我dj如果是六项的话这个写法就有点郁闷了。
另外种方式自己写函数
select new {
ul.Id,
ul.UserId,
dj= GetUserDJ(ul.CashNumber)
}
private string GetUserDJ(int cashNumber){
........
}
这个主要还是看你的实体类的定义,如果你是用的图形化的操作来生成的文件,应该就是有可空类型了