我正在使用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
等。
我也尝试使用对象item
和object[] item
,但它们都不起作用。
如何应用for
每个on
IList?
它会正常工作如果我能够在这种情况下返回DataTable
而不是IList
。
答案 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();
}