我希望其他人向我解释这段代码

时间:2013-02-25 14:13:36

标签: c# linq linq-to-entities

我有下面的代码应该为我带来一个用户列表。我正在测试" Take"是一个分页的功能,但它不起作用。

using (MyContainer myContainer = new MyContainer())
{
    // Works
    var user = myContainer.User.Where(u => u.Name == Name).ToList();
    // The "Name" comes from User.Name
    // myContainer is generated by my edmx he inherits the ObjectContext in the design generated by edmx as it shows below
    //// public partial class MyContainer : ObjectContext

    // Does not work
    var foo = (from t in myContainer.User
               select t.Name).Take(10);

    return user;
}

为什么与第一个如此相似并不起作用。

抛出异常"无法将Lambda表达式转换为' string'因为它不是委托类型"

4 个答案:

答案 0 :(得分:3)

不要指望两种形式的工作方式相同,因为它们不同。你可以像这样在函数链中表达第二个:

var foo = myContainer.User.Select(u => u.Name).Take(10);

正如预期的那样,它不像第一个表单那样工作,因为它在第一个表单返回IEnumerable<string>时返回List<User>

答案 1 :(得分:2)

第一个表达式返回User s。

的列表

第二个表达式返回Name的列表(名称可能是一个字符串)。

你应该做的事情如下:

var user = myContainer.User.Where(u => u.Name == Name).Take(10).ToList();

作为旁注,我相信你需要更多的分页,我想使用.Skip(某些东西)。拿(某些东西

答案 2 :(得分:2)

尝试myContainer.User.Take(10).ToList()获取前10位用户的列表,或myContainer.User.Take(10).Select(iter => iter.Name).ToList()获取前10位用户的列表。

答案 3 :(得分:-1)

var user = myContainer.User.Where(u => u.Name == Name).ToList();

var foo = (from t in myContainer.User
           select t.Name).Take(10);

不是正确的写作方式。如果你没有从任何一个返回任何值,你将得到ArgumentNullException。在调用

之前,首先需要确保至少返回一个值 - 意味着检查为null
.ToList() 

.Take(10)