在 LINQ 中执行 FirstOrDefault 的替代方法

发布于 2025-01-01 00:24:27 字数 1596 浏览 3 评论 0原文

我有一个成员资格表,记录用户是否是列表的成员。当用户的成员资格发生更新时,会写入新记录,并且先前的记录保持原样,从而可以维护其成员资格的历史记录。要获取用户的会员身份,需要选择他们最近的条目。

下面是一些用户列表成员资格数据的示例。目的是找到一个按列表和用户分组但仅返回最近插入记录的行的 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();

I've got a membership table that records whether a user is a member of a list. When an update to a user's membership occurs a new record is written and the previous records are left as is which allows a history of their memberships to be maintained. To get a user's membership status involves selecting their most recent entry.

An example of some user list membership data is below. The aim is to find a LINQ expression that groups by list and user but only returns the row with most recently inserted record.

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

An SQL query illustrates how the current list membership status can be extracted.

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;

The question is how to write a LINQ expression for the query that doesn't use a nested FirstOrDefault call which causes my MySQL entity framework provider to throw a "System.NotSupportedException: Specified method is not supported." exception?

Update:

Below is my failing LINQ expression, it throws the "Specified method is not supported" once the FirstOrDefault call is added.

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();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

热血少△年 2025-01-08 00:24:27

如果不发布代码,任何人都很难看出您的问题是什么。

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

Without posting code it's hard for anyone to see what your issue is.

Are you not able to just order the results by your date field and then select the first record? Something like users.OrderByDescending(u => u.Inserted).FirstOrDefault()?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文