一个蛋疼的lambda

永动bug制造机 2011-08-22 05:56:11

var query=from s in db.SubArea
......此处省略
select new{
....//此处省略
Zhan = db.Customer.Where(c => (db.graveTemp.Where(g => g.subarea == s.Id).Select(g => g.gvid).Contains(c.FgrvId)))
};
//提示错误错误 “System.Linq.IQueryable<int>”不包含“Contains”的定义,并且最佳扩展方法重载 “System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource)”的某些参数无效 F:\projects\TombPrj\TombDAL\GraveService.cs 346 60 TombDAL


缩水版表结构如下
SubArea:
Id SubName
graveTemp:
Id FsubAreaId
Customer
Id FgraveTempId
想使Zhan的值为 Customer中出现FgraveTempId为 graveTemp 中FsubAreaId=s.Id(即SubArea中的id)的Id
写成sql为
SELECT COUNT(*) FROM CUSTOMER WHERE FgraveTempId in (select id from graveTemp where FsubAreaid=s.Id)

我貌似描述明白了 不知道你们看着凌乱不。
...全文
109 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
永动bug制造机 2011-08-23
  • 打赏
  • 举报
回复
实在不好意思 用sql写了一遍发现 linq写反了 应该是从gravetemp里面查 谢谢猫哥 谢谢dongxinxi
先结贴了 我还会回来的。
永动bug制造机 2011-08-23
  • 打赏
  • 举报
回复
擦了个擦dbml里面 一个int类型 一个int? Fgrvid 是int?
永动bug制造机 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 q107770540 的回复:]
确认一下 gvid 和FgrvId类型是否相同
90%是 数据类型不一致导致你的错误:
var query=from s in db.SubArea
......此处省略
select new{
....//此处省略
Zhan = from c in db.Customer
let subIds=db.graveTemp.Where(g => g.subarea == s.Id……
[/Quote]
类型是相同的
q107770540 2011-08-22
  • 打赏
  • 举报
回复
确认一下 gvid 和FgrvId类型是否相同
90%是 数据类型不一致导致你的错误:
var query=from s in db.SubArea
......此处省略
select new{
....//此处省略
Zhan = from c in db.Customer
let subIds=db.graveTemp.Where(g => g.subarea == s.Id).Select(g => g.gvid)
where subIds.Contains(Convert.ToInt32(c.FgrvId))
select c;
};
永动bug制造机 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dongxinxi 的回复:]
C# code

var query=(from s in db.SubArea
join g in db.graveTemp on g.subarea equals s.Id select g.gvid)
.Intersect(db.Customer.Select(c=>c.FgrvId)).Count(); //Select后面可以ToLict……
[/Quote]
一开始的那个效率有问题 这个先研究下明天去再试
永动bug制造机 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 q107770540 的回复:]
let subIds=db.graveTemp.Where(g => g.subarea == s.Id).Select(g => g.gvid).ToList()

后边加个.ToList()

你的不是LINQ2SQL吧
LINQ2EF?
[/Quote]
你回答之前就是这么写报相同错tolist也用过 还是一样 是2sql
  • 打赏
  • 举报
回复
g.FgrvId equals c.FgrvId
  • 打赏
  • 举报
回复
var query=(from s in db.SubArea
join g in db.graveTemp on g.subarea equals s.Id select g.gvid)
.Intersect(db.Customer.Select(c=>c.FgrvId)).Count(); //Select后面可以ToLict()不过那样其实就变成两个语句了

var query=(from s in db.SubArea
join g in db.graveTemp on g.subarea equals s.Id
join c in db.Customer on g.FgrvId==c.FgrvId
select c).Count();
q107770540 2011-08-22
  • 打赏
  • 举报
回复
let subIds=db.graveTemp.Where(g => g.subarea == s.Id).Select(g => g.gvid).ToList()

后边加个.ToList()

你的不是LINQ2SQL吧
LINQ2EF?

永动bug制造机 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 q107770540 的回复:]
var query=from s in db.SubArea
......此处省略
select new{
....//此处省略
Zhan = from c in db.Customer
let subIds=db.graveTemp.Where(g => g.subarea == s.Id).Select(g => g.gvid)
where subIds.Contains(……
[/Quote]
猫哥 这个报错
错误 1 “System.Linq.IQueryable<int>”不包含“Contains”的定义,并且最佳扩展方法重载“System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource)”的某些参数无效
ruanwei1987 2011-08-22
  • 打赏
  • 举报
回复
q107770540 2011-08-22
  • 打赏
  • 举报
回复
var query=from s in db.SubArea
......此处省略
select new{
....//此处省略
Zhan = from c in db.Customer
let subIds=db.graveTemp.Where(g => g.subarea == s.Id).Select(g => g.gvid)
where subIds.Contains(c.FgrvId)
select c;
};
  • 打赏
  • 举报
回复
try..

var query=(from s in db.SubArea
join g in db.graveTemp on g.subarea equals s.Id select g.gvid)
.Count(gid => db.Customer.Any(c=>c.FgrvId==gid));
永动bug制造机 2011-08-22
  • 打赏
  • 举报
回复
猫哥
永动bug制造机 2011-08-22
  • 打赏
  • 举报
回复

8,497

社区成员

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

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