我有这个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)
修改它:
Select new { s.Cid, s.Siteid, FullName = dc.fn_GetSiteid(int.Parse(Session["Cid"].ToString()), s.Siteid) + " - " + s.FullName, s.Title, s.Address, s.Phone }
如果我只是添加此Select new
,我会收到此错误:
'System.Linq.IQueryable'不包含'Contains'的定义,并且最好的扩展方法重载'Ext.Net.Utilities.StringUtils.Contains(string,params string [])'有一些无效的参数
multipleSites:
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)
答案 0 :(得分:1)
您应该只需要使用正确的语法添加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[]
是一个字符串数组,这似乎很奇怪。相反,如果Session
已经int
,那么就不需要int.Parse(...)
。