Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Lambda表达式选择新建_C#_Lambda - Fatal编程技术网

C#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): 如果我

我有一个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)

如果我只是添加此
选择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();