通过具有ef核心而没有用户定义表类型的id列表查询许多对象



我有一个想要获取的对象id列表。该列表可能太大而无法使用CCD_ 1。有可能有超过10000个条目。

解决方案应该是创建一个临时表,如下所示:在SqlServer中创建临时列表/表。我可以在SQL中使用值来实现这一点,并通过联接来选择我需要的行。它看起来是这样的:

declare @idTable table (Id int)
insert into @idTable values (1), (2), (5), (7), (10)....
select MyTable.* from MyTable
inner join @idTable as ids on ids.Id= MyTable.Id

如图所示,ef核心也可能出现类似的情况:

DataTable table = new DataTable();
table.Columns.Add(new DataColumn("Id", typeof(int)));

foreach (int id in myIdList)
{
DataRow row = table.NewRow();
row["Id"] = v.FieldId;

table.Rows.Add(row);
}
var param = new SqlParameter("@idTable", table) { TypeName = "dbo.CustomSqlType", SqlDbType = SqlDbType.Structured };
var myObjects = context.MyObject.FromRawSql("select MyTable.* from MyTable
inner join @idTable as ids on ids.Id= MyTable.Id", param);

但是为了在ef核心中工作,我需要用户定义的表类型。由于数据库的性质,我宁愿不这么做。这->缺少TypeName = "dbo.CustomSqlType",我无法在服务器上创建它。上面的sql表明,没有它是可能的。创建用户定义表类型的另一种选择是每次执行时创建一个大的sql字符串。出于安全原因,我不想这样做(我不相信自己会逃避,也不应该逃避(,我希望能够重用代码,这样我就可以通过idLists从其他表中检索对象。在没有用户定义的表类型的情况下,是否可以在ef核心中以可重用的方式执行我想要的操作?


如果这在ef core中不可能实现,我也很乐意为.netcore提供另一个框架或工具。

替代方法:

在数据库中创建一个具有两个字段的模型(表(

public class SelectedRecord
{
public Guid GroupId { get; set; }
public Guid RecordId { get; set; }
}

然后,在查询数千条记录之前,插入要选择的记录

var groupId = Guid.NewGuid();
var selectedRecords = 
ids.Select(id => new SelectedRecord { GroupId = groupId, RecordId = id })
.ToArray();
context.SelectedRecords.AddRange(selectedRecords);
var objects = context.SelectedRecords
.Where(selected => selected.GroupId == groupId)
.Join(context.MyObjects,
selected => selected.RecordId,
object => object.Id,
(_, object) => object
)
.ToArray();

当然,这将需要插入数千条记录,但插入到只有两列的表中可能比运行IN (id1, id2, ..., id99999)更快

最新更新