Linq Select 查询有问题
Trouble with Linq Select Query
我正在尝试通过三个步骤在我的数据库中查询单个记录,但在获取我要查找的结果时遇到了问题。这些是我创建的步骤:
client = client
.Where(s => s.CompanyName.Contains(name));
var res = client.Select(x => x.ID);
Tracker = Tracker
.Where(s => s.ClientId.Equals(client.Select(x => x.ID)));
调试代码表明第一步和第二步工作正常并生成了我需要的数据运行我的第三个查询,它应该提供整个记录,利用第二步的结果。
第三步也是最后一步产生了以下错误:
"The LINQ expression DbSet<TimeTrackerViewModel>().Where(t => t.ClientId.Equals(DbSet<ClientsViewModel>().Where(c => c.CompanyName.Contains(__name_0)).Select(c => c.ID)))
could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information."
如何利用第二步的查询结果查询我的数据库?
如果你想使用res
中的ID
来过滤Tracker
那么你可以使用Any()
:
var res = client.Select(x => x.ID);
trackers = Tracker.Where(s => res.Any(r => r == s.ClientId));
以上查询将return一个集合。
I am trying to query my Database for a single record
如果您想 return 一条记录,那么您可以使用 FirstOrDefault()
, either in place of the Where
clause (using the same predicate), or after the Where
(you could consider Single()
如果您知道正好有 1 条匹配记录)。但是您还应该考虑如果多个记录与您的第一个查询中的 name
参数匹配时您期望发生什么,以及您将如何处理它。
在阅读了几篇相关文章后,我能够将他们的想法组合成一个可行的解决方案,如下所示:
var client = _context.ClientsViewModel
.Where(s => s.CompanyName.Contains(name))
.Select(x => x.ID).ToList();
Tracker = Tracker
.Where(s => s.ClientId == client[0])
.OrderByDescending(x => x.Id);
你应该试试这个:
var trakers = (from c in client.Where(s => s.CompanyName.Contains(name))
join t in tracker
on c.ID
equals t.ClientId
select t).ToList();
所以你只对数据库进行查询。
我正在尝试通过三个步骤在我的数据库中查询单个记录,但在获取我要查找的结果时遇到了问题。这些是我创建的步骤:
client = client
.Where(s => s.CompanyName.Contains(name));
var res = client.Select(x => x.ID);
Tracker = Tracker
.Where(s => s.ClientId.Equals(client.Select(x => x.ID)));
调试代码表明第一步和第二步工作正常并生成了我需要的数据运行我的第三个查询,它应该提供整个记录,利用第二步的结果。
第三步也是最后一步产生了以下错误:
"The LINQ expression
DbSet<TimeTrackerViewModel>().Where(t => t.ClientId.Equals(DbSet<ClientsViewModel>().Where(c => c.CompanyName.Contains(__name_0)).Select(c => c.ID)))
could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information."
如何利用第二步的查询结果查询我的数据库?
如果你想使用res
中的ID
来过滤Tracker
那么你可以使用Any()
:
var res = client.Select(x => x.ID);
trackers = Tracker.Where(s => res.Any(r => r == s.ClientId));
以上查询将return一个集合。
I am trying to query my Database for a single record
如果您想 return 一条记录,那么您可以使用 FirstOrDefault()
, either in place of the Where
clause (using the same predicate), or after the Where
(you could consider Single()
如果您知道正好有 1 条匹配记录)。但是您还应该考虑如果多个记录与您的第一个查询中的 name
参数匹配时您期望发生什么,以及您将如何处理它。
在阅读了几篇相关文章后,我能够将他们的想法组合成一个可行的解决方案,如下所示:
var client = _context.ClientsViewModel
.Where(s => s.CompanyName.Contains(name))
.Select(x => x.ID).ToList();
Tracker = Tracker
.Where(s => s.ClientId == client[0])
.OrderByDescending(x => x.Id);
你应该试试这个:
var trakers = (from c in client.Where(s => s.CompanyName.Contains(name))
join t in tracker
on c.ID
equals t.ClientId
select t).ToList();
所以你只对数据库进行查询。