在LINQ中执行FirstOrDefault的替代方法

时间:2012-01-31 22:39:58

标签: mysql linq-to-entities grouping

我有一个会员表,记录用户是否是列表的成员。当发生对用户成员资格的更新时,将写入新记录,并保留先前的记录,以允许维护其成员资格的历史记录。获取用户的成员身份涉及选择他们最近的条目。

下面是一些用户列表成员资格数据的示例。目的是找到一个按列表和用户分组的LINQ表达式,但只返回最近插入记录的行。

List Name, Username, Comment, ExpiresOn, Inserted
Test List, joeb, second update, 2012-03-13 16:55:03, 2012-01-31 22:28:40
Test List, joeb, first update, 2012-02-13 16:55:01, 2012-01-31 22:28:39
Test List, joeb, initial, 2012-01-13 16:55:02, 2012-01-31 22:28:38

SQL查询说明了如何提取当前列表成员资格状态。

select ulm2.ID, ulm2.ExpiresOn, ulm2.Comment, ulm2.Inserted 
from UserListMembership as ulm1
left outer join UserListMembership ulm2 on ulm1.id = ulm2.id
group by ulm1.userlistid, ulm1.userid;

问题是如何为不使用嵌套的FirstOrDefault调用的查询编写LINQ表达式,这导致我的MySQL实体框架提供程序抛出“System.NotSupportedException:不支持指定的方法”。异常?

更新

下面是我失败的LINQ表达式,一旦添加了FirstOrDefault调用,就会抛出“不支持指定的方法”。

var query = from mem in db.UserListMemberships
            where
              mem.User.UserUsernames.Any(y => y.Username.ToLower() == username.ToLower())
              && mem.UserList.Account.Subscriptions.Any(x => x.ID == subscriptionID)
              && mem.ExpiresOn > utcNow
            group mem by new { mem.UserListID, mem.UserID } into g
            select new { UserListMembership = (from mem2 in db.UserListMemberships where mem2.UserListID == g.Key.UserListID && mem2.UserID == g.Key.UserID orderby mem2.Inserted descending select mem2).FirstOrDefault() };

 return query.Select(a => a.UserListMembership).ToList();

1 个答案:

答案 0 :(得分:0)

如果没有发布代码,任何人都很难看到你的问题。

您是否无法按日期字段排序结果,然后选择第一条记录?像users.OrderByDescending(u => u.Inserted).FirstOrDefault()

这样的东西