Linq查询问题高手来

yaoyuchicc 2011-09-02 01:31:10
public int SpConverter(string str, DateTime? sPCutDate)
{
if (string.IsNullOrEmpty(str) || !sPCutDate.HasValue)
return 0;
if (str.Equals("True") || str.Equals("true"))
{
if (sPCutDate.HasValue)
{
if (sPCutDate.Value > DateTime.Now)
return 1;
}
}
return 0;
}

var result = from c in this.dbc.SecondHouse
select new
{
JiaJi=SpConverter(c.UrgentSale,c.SPCutDate)
}
return result;
前台能绑定也能显示
return result.Where(o=>o.JiaJi==1);
报错方法“Int32 SpConverter(System.String, System.Nullable`1[System.DateTime])”不支持转换为 SQL
求解
...全文
289 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
diecode 2011-09-07
  • 打赏
  • 举报
回复
围观。。。。。。
yaoyuchiccc 2011-09-05
  • 打赏
  • 举报
回复
无法将表达式“Table(SecondHouse).Select(c => new <>f__AnonymousType77`45(Id = c.Id, Area = c.Area, EntId = c.EntId, PerID = c.PerID, StaID = c.StaID, IndID = c.IndID, CityId = c.CityId, Seq = c.Seq, InfoType = c.InfoType, AgentHouseNo = c.AgentHouseNo, CreateTime = c.CreateTime, Acreage = c.Acreage, OtherAcreage = c.OtherAcreage, BuyPrice = c.BuyPrice, Pay = c.Pay, IsAudit = c.IsAudit, Solo = c.Solo, DetialAddress = c.DetialAddress, InFloor = c.InFloor, SumFloor = c.SumFloor, HouseDirection = c.HouseDirection, Type = c.Type, Style = c.Style, BuildDate = c.BuildDate, Publisher = c.Publisher, Ower = c.Ower, Config = c.Config, AuxiliaryEquipment = c.AuxiliaryEquipment, Remark = c.Remark, Pic = c.Pic, PicName = c.PicName, SP = c.UrgentSale, SPCutDate = c.SPCutDate, Phone = c.Phone, Status = c.Status, LinkMan = c.LinkMan, Integrity = c.Integrity, enName = c.Enterprise.EntName, Validity = c.Validity, SectionID = c.SectionID, JiaJi = IIF((IsNullOrEmpty(c.UrgentSale) || Not(c.SPCutDate.HasValue)), 0, IIF(((c.UrgentSale.Equals("True") || c.UrgentSale.Equals("true")) && (c.SPCutDate.HasValue && (c.SPCutDate.Value > Invoke(value(System.Func`1[System.DateTime]))))), 1, 0)), Title = c.SecondHouseOtherInfo.FirstOrDefault().Title, hi = c.SecondHouseOtherInfo.FirstOrDefault().Housing, oi = c.SecondHouseOtherInfo.FirstOrDefault(), he = c.SecondHouseEquipment.FirstOrDefault()))”转换为 SQL 并且无法将它视为局部表达式。
yaoyuchiccc 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 claymore1114 的回复:]

里头的 每个三元 也打上括号,让思路清晰点。 要不你贴代码,让大家 帮你看看。
[/Quote]

JiaJi=((string.IsNullOrEmpty(c.UrgentSale) || (!c.SPCutDate.HasValue))?0:
((((c.UrgentSale.Equals("True")) || (c.UrgentSale.Equals("true"))) &&((c.SPCutDate.HasValue)&&(c.SPCutDate.Value > DateTime.Now)))?1:0))

(CASE
WHEN NOT ([t0].[SPCutDate] IS NOT NULL) THEN 1
WHEN NOT NOT ([t0].[SPCutDate] IS NOT NULL) THEN 0
ELSE NULL
END) AS [value],
(CASE
WHEN (([t0].[UrgentSale] = 'True') OR ([t0].[UrgentSale] = 'true')) AND ([t0].[SPCutDate] IS NOT NULL) AND (([t0].[SPCutDate]) > '2011-09-05 10:07:31') THEN 1
WHEN NOT ((([t0].[UrgentSale] = 'True') OR ([t0].[UrgentSale] = 'true')) AND ([t0].[SPCutDate] IS NOT NULL) AND (([t0].[SPCutDate]) > '2011-09-05 10:07:31')) THEN 0
ELSE NULL
END) AS [value2]

第二个版本

JiaJi=((string.IsNullOrEmpty(c.UrgentSale) || (!c.SPCutDate.HasValue))?0:
(((((c.UrgentSale.Equals("True")) || (c.UrgentSale.Equals("true"))) &&(((c.SPCutDate.HasValue)&&(c.SPCutDate.Value > DateTime.Now)))?1:0))))

生成语句
(CASE
WHEN NOT ([t0].[SPCutDate] IS NOT NULL) THEN 1
WHEN NOT NOT ([t0].[SPCutDate] IS NOT NULL) THEN 0
ELSE NULL
END) AS [value],
(CASE
WHEN (([t0].[UrgentSale] = True) OR ([t0].[UrgentSale] = true)) AND ([t0].[SPCutDate] IS NOT NULL) AND (([t0].[SPCutDate]) > '2011-09-05 11:52:16') THEN 1
WHEN NOT ((([t0].[UrgentSale] = True) OR ([t0].[UrgentSale] = true)) AND ([t0].[SPCutDate] IS NOT NULL) AND (([t0].[SPCutDate]) > '2011-09-05 11:52:16')) THEN 0
ELSE NULL
END) AS [value2], (
SELECT [t3].[Title]
FROM (
SELECT TOP (1) [t2].[Title]
FROM [dbo].[SecondHouseOtherInfo] AS [t2]
WHERE [t2].[SecId] = [t0].[Id]
) AS [t3]
) AS [value3]
claymore1114 2011-09-05
  • 打赏
  • 举报
回复
里头的 每个三元 也打上括号,让思路清晰点。 要不你贴代码,让大家 帮你看看。
yaoyuchiccc 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 claymore1114 的回复:]

打上 括号试试, 可能执行 顺序问题。
JiaJi=(.....)
[/Quote]

我试过了`生成的还是2列
claymore1114 2011-09-05
  • 打赏
  • 举报
回复
打上 括号试试, 可能执行 顺序问题。
JiaJi=(.....)
yaoyuchicc 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 claymore1114 的回复:]

你用的 是 linq to sql? 还是 entity
1、还会报错 就提早ToList
from c in this.dbc.SecondHouse.ToList()....
2、建议 用 三元,生成那种 Case When的
from c in this.dbc.SecondHouse
select new
{
JiaJi=(string.IsNullO……
[/Quote]

生成的sql语句三元表达式那块生成的sql语句是
(CASE
WHEN NOT ([t0].[SPCutDate] IS NOT NULL) THEN 1
WHEN NOT NOT ([t0].[SPCutDate] IS NOT NULL) THEN 0
ELSE NULL
END) AS [value],
(CASE
WHEN (([t0].[UrgentSale] = 'True') OR ([t0].[UrgentSale] = 'true')) AND ([t0].[SPCutDate] IS NOT NULL) AND (([t0].[SPCutDate]) > '2011-09-05 10:07:31') THEN 1
WHEN NOT ((([t0].[UrgentSale] = 'True') OR ([t0].[UrgentSale] = 'true')) AND ([t0].[SPCutDate] IS NOT NULL) AND (([t0].[SPCutDate]) > '2011-09-05 10:07:31')) THEN 0
ELSE NULL
END) AS [value2]
生成了2列
yaoyuchicc 2011-09-05
  • 打赏
  • 举报
回复
转换为 SQL 并且无法将它视为局部表达式。
yaoyuchicc 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 claymore1114 的回复:]

你用的 是 linq to sql? 还是 entity
1、还会报错 就提早ToList
from c in this.dbc.SecondHouse.ToList()....
2、建议 用 三元,生成那种 Case When的
from c in this.dbc.SecondHouse
select new
{
JiaJi=(string.IsNullO……
[/Quote]

你的第二种方法报错

JiaJi = IIF((IsNullOrEmpty(c.UrgentSale) || Not(c.SPCutDate.HasValue)), 0, IIF((((c.UrgentSale.Equals("True") || c.UrgentSale.Equals("true")) && c.SPCutDate.HasValue) && (c.SPCutDate.Value > Invoke(value(System.Func`1[System.DateTime])))), 1, 0))
无法转换成SQL表达式
coder_s 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yaoyuchicc 的回复:]

引用 4 楼 abbey 的回复:
你自己定义的方法SpConverter(),又不是SQL内置的函数,LINQ没办法利用它生成查询用的SQL语句。

那为什么可以绑定并显示? 可是一Where(o=>o.JiaJi==1)
就会
报错方法“Int32 SpConverter(System.String, System.Nullable`1[System.DateTime])”不支持转……
[/Quote]
不可能正确的, 以前我也碰到跟你一样的 疑惑, 不过可以给个思路,首先4 楼 abbey 回复的是有道理的,但不完全,.net fw 里 觉大多数函数 都不能自动转换, 你的第一次直接返回就能绑定,而第二次不行 我觉得可以 猜想下 它的机制,当你直接返回时,你语句的结尾处 其实是在内存操作,linq会把 你前半句select 查询出来,然后操作你的函数,如果 你加条件,别管是where 还是 诸如 skip take 之类都会报错 因为这时候 你的语句还没结束 它会继续拼装 转换 成sql 所以会不支持,这种问题是很常见的问题.
阿非 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yaoyuchicc 的回复:]
引用 4 楼 abbey 的回复:
你自己定义的方法SpConverter(),又不是SQL内置的函数,LINQ没办法利用它生成查询用的SQL语句。

那为什么可以绑定并显示? 可是一Where(o=>o.JiaJi==1)
就会
报错方法“Int32 SpConverter(System.String, System.Nullable`1[System.DateTime])”不支持转换……
[/Quote]
因为linq 是延迟执行,你需要让
from c in this.dbc.SecondHouse
select new
{
JiaJi=SpConverter(c.UrgentSale,c.SPCutDate)
}
先执行一下,然后再Where
claymore1114 2011-09-02
  • 打赏
  • 举报
回复
你用的 是 linq to sql? 还是 entity
1、还会报错 就提早ToList
from c in this.dbc.SecondHouse.ToList()....
2、建议 用 三元,生成那种 Case When的
from c in this.dbc.SecondHouse
select new
{
JiaJi=(string.IsNullOrEmpty(c.UrgentSale) || !c.SPCutDate.HasValue)?0:
(((c.UrgentSale.Equals("True") || c.UrgentSale.Equals("true")) &&c.SPCutDate.HasValue&&c.SPCutDate.Value > DateTime.Now)?1:0)
}
zzc_king 2011-09-02
  • 打赏
  • 举报
回复
。。 你继续
yaoyuchicc 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zzc_king 的回复:]
var value=result.ToList().where(o=>o.JiaJi==1);

return value;
这样试试
[/Quote]
你是不是喝了哥们???你洗洗睡吧
zzc_king 2011-09-02
  • 打赏
  • 举报
回复
var value=result.ToList().where(o=>o.JiaJi==1);

return value;
这样试试
yaoyuchicc 2011-09-02
  • 打赏
  • 举报
回复

有没有什么办法
我就想用Linq实现sql里多个JiaJi字段他的值是

CASE WHEN SPCutDate >GETDATE() AND UrgentSale='True'
THEN 0 ELSE 1 END


然后 result.Where(o=>o.JiaJi==1);做个条件查询
我搞不明白`为什么能绑定控件 也能显示 JiaJi的值`为什么加上Where条件会报
“Int32 SpConverter(System.String, System.Nullable`1[System.DateTime])”不支持转换为 SQL
yaoyuchicc 2011-09-02
  • 打赏
  • 举报
回复

有没有什么办法
我就想实现sql里多个JiaJi字段他的值是

CASE WHEN SPCutDate >GETDATE() AND UrgentSale='True'
THEN 0 ELSE 1 END
ajaxtop 2011-09-02
  • 打赏
  • 举报
回复
没搞明白
帮顶下
yaoyuchicc 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zzc_king 的回复:]
你那个方法是什么返回值
[/Quote]
哥`敬业点好吗?上面又不是没代码
zzc_king 2011-09-02
  • 打赏
  • 举报
回复
你那个方法是什么返回值
加载更多回复(7)

8,492

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧