积极答复者
请教一个LINQ to Entities 代码的写法

问题
-
我有一个用户可以发送消息的系统,一个用户可以跟随多个用户,以查看这些用户发送的消息。我设计了三个表,Users 、Statuses(消息表)、Followers (跟随表, 此表有两个字段,UserId和FollowerId,全部与Users的主键对应)我生成的edmx里有 Users 和 Statues 两个实体。请教:获取某用户A,的所有更随者已经发过的消息的 LINQ to Entities 代码如何写?我想LINQ to Entities 代码最终得到类似这样的t-sql语句:WITH AllFollowers (FollowerId) AS(SELECT f.FollowerIdFROM Followers AS f INNER JOINTwitterUsers AS ff ON f.FollowerId = ff.IdWHERE (f.UserId = 1) -- 这里的1实际应用中为参数)SELECT s.CreatedAt, s.Id, s.UserId, s.[Text]FROM Statuses AS sINNER JOIN AllFollowers f on s.UserId = f.FollowerId或者SELECT s.CreatedAt, s.Id, s.UserId, s.[Text]FROM Statuses AS sINNER JOIN(SELECT f.FollowerIdFROM Followers AS f INNER JOINTwitterUsers AS ff ON f.FollowerId = ff.IdWHERE (f.UserId = 1) -- 这里的1实际应用中为参数) AS tt on tt.FollowerId = s.UserId
答案
-
status.User.Name
宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。- 已标记为答案 Allen Chen - MSFTModerator 2009年8月10日 6:25
全部回复
-
from user in User
from Follower in User.Followers
where User.Userid==1;
select Follower.Statues
Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
Visual C++ MVP- 已编辑 Sheng Jiang 蒋晟Moderator 2009年8月3日 5:03
-
查询是没问题了,但又有新问题了:Statuses里有导航属性Users,为了省事,我表示层也是用Statuses作为表示层实体,同时数据访问层也用Statuses传输数据,这样我需要Statuses有个Username属性,方便界面的显示。所以我将上面的LINQ to Entities 查询改成了这样:
var status = from u in edm.TwitterUsers
from f in u.FollowTo
from s in f.Statuses
where u.Id == 1
select new Statuses
{
CreatedAt = s.CreatedAt,
Favorited = s.Favorited,
Id = s.Id,
InReplyToScreenName = s.InReplyToScreenName,
InReplyToStatusID = s.InReplyToStatusID,
InReplyToUserID = s.InReplyToUserID,
Source = s.Source,
Text = s.Text,
Truncated = s.Truncated,
//UserId = u.Id.ToString(),
Username = u.Name// 我估计问题出在这里,LINQ to Entities 查询是不是不支持MSL之外的EntitySet属性,估计SQL语句是根据SSDL生产的吧?
};
会出现这个问题:
在 LINQ to Entities 查询中无法构造实体或复杂类型“XXXModel.Statuses”。
当然,
var status = from u in edm.TwitterUsers
from f in u.FollowTo
from s in f.Statuses
where u.Id == 1
select s;
这个LINQ to Entities 查询没有问题。 -
我这里还有这个问题:如何简化Linq 语句中的select new {......}
http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/76f2c3bb-3020-433e-b3ec-289015adfe11
我估计 直接这样写:
var status2 = from s in edm.Statuseswhere s.Users.Id == userIdjoin u in edm.Users on s.Users.Id equals u.Idselect new{CreatedAt = s.CreatedAt,Favorited = s.Favorited,Id = s.Id,InReplyToScreenName = s.InReplyToScreenName,InReplyToStatusID = s.InReplyToStatusID,InReplyToUserID = s.InReplyToUserID,Source = s.Source,Text = s.Text,Truncated = s.Truncated,UserId = u.Id,Username = u.Name};也会报这个错:“在 LINQ to Entities 查询中无法构造实体或复杂类型“XXXModel.Statuses”。”
我马上试试。 -
var status = from u in edm.Usersfrom f in u.FollowTofrom s in f.Statuseswhere u.Id == 1//////join user in edm.Users on s.Users.Id equals user.Idselect new{CreatedAt = s.CreatedAt,Favorited = s.Favorited,Id = s.Id,InReplyToScreenName = s.InReplyToScreenName,InReplyToStatusID = s.InReplyToStatusID,InReplyToUserID = s.InReplyToUserID,Source = s.Source,Text = s.Text,Truncated = s.Truncated,UserId = u.Id,Username = u.Name};我这样试了一下,查询是通过了,但得到结果不正确,Username和UserId 全是一个值,就是where条件的1,Username的值应该是用户1所跟随的人, 显然生成的sql语句不是我想要的,
-
我觉得结果不对的原因在于:from u in edm.Usersfrom f in u.FollowTo这两句其实有个约束,即 u.Id == f.UserId,我如何加这个约束条件呢?但f不可能有UserId属性,这里是不是要将Followers表(跟随表, 此表有两个字段,UserId和FollowerId),也引进来?这个嵌套查询中SELECT f.FollowerId,不知如何能得到,SELECT s.CreatedAt, s.Id, s.UserId, s.[Text]FROM Statuses AS sINNER JOIN(SELECT f.FollowerIdFROM Followers AS f INNER JOINTwitterUsers AS ff ON f.FollowerId = ff.IdWHERE (f.UserId = 1) -- 这里的1实际应用中为参数) AS tt on tt.FollowerId = s.UserId
-
status.User.Name
宠辱不惊,看庭前花开花落。去留无意,望天上云卷云舒。- 已标记为答案 Allen Chen - MSFTModerator 2009年8月10日 6:25