【发布时间】:2018-06-14 15:40:34
【问题描述】:
我正在尝试优化下面的代码,该代码逐个循环对象并进行数据库查找。我想编写一个 LINQ 语句,在一个事务中执行相同的任务。
这是我的低效循环代码;
IStoreUnitOfWork uow = StoreRepository.UnitOfWorkSource.GetUnitOfWorkFactory().CreateUnitOfWork();
var localRunners = new List<Runners>();
foreach(var remoteRunner in m.Runners) {
var localRunner = uow.CacheMarketRunners.Where(x => x.SelectionId == remoteRunner.SelectionId && x.MarketId == m.MarketId).FirstOrDefault();
localRunners.Add(localRunner);
}
这是我在单个查询中执行相同操作的非常可行的尝试。好吧,这甚至不是一次尝试。我不知道从哪里开始。 remoteRunners 对象有一个复合键。
IStoreUnitOfWork uow = StoreRepository.UnitOfWorkSource.GetUnitOfWorkFactory().CreateUnitOfWork();
var localRunners = new List<Runners>();
var localRunners = uow.CacheMarketRunners.Where(x =>
x.SelectionId in remoteRunners.SelectionId &&
x.MarketId in remoteRunners.MarketId);
感谢您的关注
【问题讨论】:
-
List
localRunners = uow.CacheMarketRunners.Where(x => x.SelectionId == remoteRunner.SelectionId && x.MarketId == m.MarketId).Select(x => x.FirstOrDefault ()).ToList(); -
你必须实际构建一个表达式,或者是那些条件一起像this
-
另外,您可以创建两个值的字符串表示形式列表,例如
var remotes = m.Runners.Select(r => r.SelectionId + ";" + r.MarketId).ToList(),然后像Where(x => remotes.Contains(x.SelectionId + ";" + x.MarketId))一样使用它。但是请注意,这不会像查询那样有效,因为它不能利用这些列上的任何索引。 -
@jdweng 这没有任何意义。
-
@juharr 谢谢。我想我可以让它这样工作。似乎不得不做一件痛苦的事情!我会试试看。