在linq查询结果中使用foreach的问题

时间:2011-04-11 00:52:16

标签: c# asp.net linq

我有linq查询如下:

var result = (from Customer cust in db select new { userNameList = cust.UserName }).ToList();

我想遍历列表中的每个值<>

我试图使用foreach来实现这一目标。这是愚蠢的,我无法弄清楚

我正在使用这样的东西

foreach (List<string> item in result)
            {
                if (item.ToString() == userName)
                {
                    userExistsFlag = 1;
                }
            }

但.net编译器只是吓坏了:

给我这些错误

  1. 无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.List'

  2. 无法将'AnonymousType#1'类型转换为'System.Collections.Generic.List'

  3. 感谢您的期待

    所有这些最有效并且消耗少量资源的实施方案。 如果有人可以为我确认这一点,那就足够了。

5 个答案:

答案 0 :(得分:5)

使用Linq更短:

bool userExistsFlag  = result.Any( x=> x.userNameList  == userName);

正如其他答案所示,您不需要投射到匿名类型:

var userNames = (from Customer cust in db select cust.UserName).ToList();
bool userExists = userNames.Contains(userName);

修改

效率最高 - 如果你不需要用户名组 - 就是直接查询数据库以检查用户名是否存在,所以

 bool userExists = db.Any( x => x.UserName == userName);

@Jris Shaffer在评论和@Cyber​​natet的回答中得到了信用 - 他几乎就在那里。我建议你接受他的答案,但使用Any(); - )

答案 1 :(得分:3)

尝试:

var result = (from Customer cust in db select new { userNameList = cust.UserName }).ToList();
userExistsFlag = result.Where(a=> a.userNameList == userName).Count() > 0;

or

userExistsFlag = (
                    from Customer cust in db 
                    where cust.UserName = userName
                    select cust
                 ).Count() > 0;

答案 2 :(得分:2)

如果您的查询返回一个名称列表,那么您的FOREACH循环应该如下所示

foreach( String name in results ){
  ...
}

答案 3 :(得分:1)

使用new { userNameList = cust.UserName }跳过,这使得它成为一个匿名实例。你可以尝试

var result = (from Customer cust in db select cust.UserName ).ToList();

答案 4 :(得分:0)

如果您只是获取一个属性并且想要一个字符串列表,则没有理由使用匿名类型。代码应该像这样工作:

var result = (from Customer cust in db select cust.UserName).ToList();