首页 新闻 会员 周边 捐助

linq 子查询中怎么使用Isnull

0
悬赏园豆:100 [已解决问题] 解决于 2012-11-13 13:34
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该怎么写啊,我是新手。

woalmen的主页 woalmen | 初学一级 | 园豆:112
提问于:2012-11-13 11:28
< >
分享
最佳答案
0

            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在外层查询中.

收获园豆:100
夏狼哉 | 小虾三级 |园豆:833 | 2012-11-13 13:29

谢谢,帮助很大

woalmen | 园豆:112 (初学一级) | 2012-11-13 13:32
其他回答(3)
0

linq中 isnull 情况,可空类型用 Nullable<T>.Equals,  引用类型用Nullable.Equals。

你的好像是子查询,可以考虑 通过 子查询的记录数Count 是否大于0来进行相关逻辑判断

Qlin | 园豆:2403 (老鸟四级) | 2012-11-13 12:19

有记录的还分已收跟欠费2种,所以用Count不行

支持(0) 反对(0) woalmen | 园豆:112 (初学一级) | 2012-11-13 12:21

@woalmen: 

var query=from t in task
                 let c=charge.FirstOrDefault(w=>w.code==t.code)
                 select new{
          charge=(c==null?"未收":c.isend=1? "欠费":"'已收")
}
支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2012-11-13 12:29
0

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){
........
}

az235 | 园豆:8483 (大侠五级) | 2012-11-13 12:20
0

这个主要还是看你的实体类的定义,如果你是用的图形化的操作来生成的文件,应该就是有可空类型了

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-13 13:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册