关于IEnumerable或IList

时间:2016-02-10 11:27:50

标签: c# linq

我正在使用LINQ with Entity框架来连接三个表,我正在返回IList接口。

我想对此返回值应用foreach循环,以便我可以在模型中填充值。

这就是我加入的方式:

public IList GetData(long Id)
{
    //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),)
    var query = from u in dataContext.tblUsers
    join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id
    join c in dataContext.tblComments on u.Id equals c.Commentedby

    where c.Id == Id
    select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate };

    return query.ToList();
}

我想在我的模型列表中填充这些值。我试过这个:

var lst = repository.GetDate(Id);
foreach (var item in lst)
{

}

但我无法访问项目Firstname / Lastname等。

我也尝试使用对象itemobject[] item,但它们都不起作用。

如何应用for每个on IList?

它会正常工作如果我能够在这种情况下返回DataTable而不是IList

6 个答案:

答案 0 :(得分:7)

您正在创建匿名类型。只需为查询结果定义一个类,然后函数的返回类型应如下所示:

public IList<YourClassName> GetData(long Id)
{

}

最后设置类值:

select new YourClassName 
{
    Firstname = u.Firstname,
    Lastname = u.Lastname, 
    ProfilePicPath = p.ProfilePicPath,
    Comment = c.Comment,
    CommentDate = c.CommentDate
};

答案 1 :(得分:4)

您在方法中返回anonymous objects列表。您可以使用反射访问属性,但这在运行时很慢。最容易获取类型信息的方法是定义一个类并在select语句中使用它。

public class Person
{
   public string Firstname { get; set; }
   public string Lastname { get; set; }
   /* ... */
}

public IList<Person> GetData(long Id)
{   
    var query = from u in dataContext.tblUsers
                join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id
                join c in dataContext.tblComments on u.Id equals c.Commentedby
                where c.Id == Id
                select new Person { u.Firstname, u.Lastname /* ... */ };
        return query.ToList();
}

答案 2 :(得分:1)

您正在创建一个匿名类型:

select new { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate };

如果要将此数据传递给其他方法等,则需要创建一个真正的类。

public class DataClass
{
    public string Firstname { get; set; }
    public string LastName{ get; set; }
    public string ProfilePicPath { get; set; }
    public string Comment { get; set; }
    public DateTime CommentDate { get; set; }
}

并使用它:

public IList<DataClass> GetData(long Id)
{
    var query = from u in dataContext.tblUsers
                join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id
                join c in dataContext.tblComments on u.Id equals c.Commentedby
                where c.Id == Id
    select new DataClass
    {
        Firstname = u.Firstname,
        Lastname = u.Lastname,
        ProfilePicPath = p.ProfilePicPath,
        Comment = c.Comment,
        CommentDate = c.CommentDate
    };

    return query.ToList();
}

答案 3 :(得分:1)

您不仅应返回IList接口,还应返回与您的类型相关的参数化接口。现在你回复一个对象。

所以我想建议。创建这个类:

public class MyCustomContainer
{
   public string Firstname { get; set; }
   public string Lastname { get; set; }
   public string ProfilePicPath { get; set; }
   public string Comment { get; set; } 
   public string CommentDate { get; set; }
}

改变你的方法是这样的:

  public IList<MyCustomContainer> GetData(long Id)
        {
            //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),)
            var query = from u in dataContext.tblUsers
                        join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id
                        join c in dataContext.tblComments on u.Id equals c.Commentedby
                        where c.Id == Id
                        select new MyCustomContainer 
                         { 
                             Firstname  = u.Firstname, 
                             Lastname = u.Lastname, 
                             ProfilePicPath = p.ProfilePicPath, 
                             Comment = c.Comment, 
                             CommentDate = c.CommentDate 
                          };
            return query.ToList();
        }

现在您不在List中返回anonymouse对象,这样您就可以获得所需的所有属性

答案 4 :(得分:0)

您使用的是匿名类型,因此在循环浏览列表时无法将其强制转换为任何内容。您可以尝试使用dynamic而不是var,这意味着只要它在运行时存在就可以调用它上面的任何属性:

foreach (dynamic item in lst)
{
    string firstName = item.FirstName;
}

或明确定义结果项的类,就像其他答案所暗示的那样。

答案 5 :(得分:0)

您必须更改 GetData 返回类型。请试试这个:

public List<tblUsers> GetData(long Id)
        {
            //var q = dataContext.tblUsers.AsEnumerable().Join(dataContext.tblUsersProfiles.AsEnumerable(),)
            var query = from u in dataContext.tblUsers
                        join p in dataContext.tblUsersProfiles on u.ProfileId equals p.Id
                        join c in dataContext.tblComments on u.Id equals c.Commentedby
                        where c.Id == Id
                        select new tblUsers { u.Firstname, u.Lastname, p.ProfilePicPath, c.Comment, c.CommentDate };
            return query.ToList();
        }