我正在使用LINQ2SQL在SQL(精简版)数据库中搜索一堆int32。
我的主要问题是我有一个很大的列表(数千)的int32,我想要DB中的所有记录,其中DB中的id字段与我的任何int32匹配。目前我正在选择一行,有效地搜索索引数千次。
如何优化此功能?温度表?
答案 0 :(得分:1)
这听起来像你可以使用包含查询:
int[] intArray = ...;
var matches = from item in context.SomeTable
where intArray.Contains(item.id)
select item;
答案 1 :(得分:1)
对于数千个值的分类,您可以选择:
我不确定你可以用Compact Edition做什么。
答案 2 :(得分:0)
将您的整数插入SQL表中,然后执行:
var items = from row in table
join intRow in intTable on row.TheIntColumn equals intRow.IntColumn
select row;
编辑1& 2:更改了答案,因此他加入了2个表,没有集合。
答案 3 :(得分:0)
我的偏好是为搜索编写存储过程。如果您正在搜索的字段上有索引,那么当将要处理的行数增加时,将使您的生活变得更加轻松。
您将遇到的复杂性是编写一个可以从输入参数执行IN子句的select语句。您需要的是使用表值函数将字符串(Id的)转换为列并在IN子句中使用该列。 像:
Select *
From SomeTable So
Where So.ID In (Select Column1 From dbo.StringToTable(InputIds))
答案 4 :(得分:0)
在厌倦了编写手动批处理代码后,我想出了这个linq解决方案。 它并不完美(即批次并不完美),但它解决了这个问题。 当你不被允许编写存储过程或sql函数时非常有用。适用于几乎所有linq表达式。
享受:
public static IQueryable<TResultElement> RunQueryWithBatching<TBatchElement, TResultElement>(this IList<TBatchElement> listToBatch, int batchSize, Func<List<TBatchElement>, IQueryable<TResultElement>> initialQuery)
{
return RunQueryWithBatching(listToBatch, initialQuery, batchSize);
}
public static IQueryable<TResultElement> RunQueryWithBatching<TBatchElement, TResultElement>(this IList<TBatchElement> listToBatch, Func<List<TBatchElement>, IQueryable<TResultElement>> initialQuery)
{
return RunQueryWithBatching(listToBatch, initialQuery, 0);
}
public static IQueryable<TResultElement> RunQueryWithBatching<TBatchElement, TResultElement>(this IList<TBatchElement> listToBatch, Func<List<TBatchElement>, IQueryable<TResultElement>> initialQuery, int batchSize)
{
if (listToBatch == null)
throw new ArgumentNullException("listToBatch");
if (initialQuery == null)
throw new ArgumentNullException("initialQuery");
if (batchSize <= 0)
batchSize = 1000;
int batchCount = (listToBatch.Count / batchSize) + 1;
var batchGroup = listToBatch.AsQueryable().Select((elem, index) => new { GroupKey = index % batchCount, BatchElement = elem }); // Enumerable.Range(0, listToBatch.Count).Zip(listToBatch, (first, second) => new { GroupKey = first, BatchElement = second });
var keysBatchGroup = from obj in batchGroup
group obj by obj.GroupKey into grouped
select grouped;
var groupedBatches = keysBatchGroup.Select(key => key.Select((group) => group.BatchElement));
var map = from employeekeysBatchGroup in groupedBatches
let batchResult = initialQuery(employeekeysBatchGroup.ToList()).ToList() // force to memory because of stupid translation error in linq2sql
from br in batchResult
select br;
return map;
}
用法:
using (var context = new SourceDataContext())
{
// some code
var myBatchResult = intArray.RunQueryWithBatching(batch => from v1 in context.Table where batch.Contains(v1.IntProperty) select v1, 2000);
// some other code that makes use of myBatchResult
}
然后使用结果,扩展到列表,或任何你需要的。只要确保你没有丢失DataContext引用。