C#Lambda表达式选择新建
我有一个lambda表达式:C#Lambda表达式选择新建,c#,lambda,C#,Lambda,我有一个lambda表达式: this.SitesStore.DataSource = dc.Sites.Where(s => multipleSites.Select(ms => ms.Siteid ) .Contains(s.Siteid) && s.Cid == int.Parse(Session["Cid"].ToString())).ToList(); 但是我想用这个Select new来修改它,而不是Select(ms=>ms.Siteid): 如果我
this.SitesStore.DataSource =
dc.Sites.Where(s => multipleSites.Select(ms => ms.Siteid )
.Contains(s.Siteid) && s.Cid == int.Parse(Session["Cid"].ToString())).ToList();
但是我想用这个Select new
来修改它,而不是Select(ms=>ms.Siteid)
:
如果我只是添加此选择new
,则会出现以下错误:
“System.Linq.IQueryable”不包含“Contains”的定义,并且最佳扩展方法重载“Ext.Net.Utilities.StringUtils.Contains(string,params string[])”具有一些无效参数
多个点:
var multipleSites = (from cs in dc.CUsersSites
join c in dc.CUsers on cs.UserId equals c.UserId
where cs.Cid == int.Parse(Session["Cid"].ToString()) && c.UserName == HttpContext.Current.User.Identity.Name
select cs).ToList();
模式
CUsersSites (id, UserId, Cid, Siteid)
CUsers (id, UserId, UserName)
Sites (id, Cid, Siteid, FullName)
您只需添加
Select
,使用前面提到的@JonSkeet的正确语法即可。此外,您可以通过使用Any(ms=>…)
而不是Where
来简化和避免遇到的问题(在编辑中提到)
下面是完整的示例
this.SitesStore.DataSource = dc.Sites
.Where(s => multipleSites.Any(ms => ms.Siteid == s.Siteid && s.Cid == int.Parse(Session["Cid"].ToString())))
.Select(s => new { ... })
.ToList();
因此,这应该是值得注意的:
- 这假定
的类型为Cid
李>int
- 我觉得奇怪的是,您需要调用
假定ToString()
是一个字符串数组。相反,如果会话[]
已保持Session
,则不需要int
int.Parse(…)
selectnew{…}
替换方法调用,但您可以使用Select(ms=>new{…})
使用该选择实现什么?Contains
方法应该在和数组上使用,但是新的Select(s=>new{…})
返回一个匿名类型的objects数组。请参阅对我的答案的编辑,这样做有效吗?在这里做一些假设…代码转储不被视为答案,请在回答中解释您的代码op希望使用该选择而不是select(ms=>ms.Siteid)
是否这样做?您提到的Select
嵌套在的Where
(谓词)中,应该能够保持不变。
this.SitesStore.DataSource = dc.Sites
.Where(s => multipleSites.Any(ms => ms.Siteid == s.Siteid && s.Cid == int.Parse(Session["Cid"].ToString())))
.Select(s => new { ... })
.ToList();