C#Lambda表达式选择新的

时间:2018-03-01 11:14:22

标签: 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)修改它:

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)

1 个答案:

答案 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(...)