如何通过复合键检索多个实体?

hea*_*vyd 3 sql-server entity-framework composite-key entity-framework-4

我正在使用实体框架(4.2,如果这很重要),我有一个具有复合主键(两个int列)的模型.我有一对整数的列表,它们代表了我想从数据库中提取的对象列表.有没有一种简单的方法可以使用单个查询来提取所有这些对象?

我已经尝试将查询加入我的列表,如下所示:

List<Tuple<int, int>> ids = GetIds();

var data =
    from e in ctx.CompositeEntities
    join i in ids on new {e.KeyA, e.KeyB} equals new {KeyA = i.Item1, KeyB = i.Item2}
    select e;
Run Code Online (Sandbox Code Playgroud)

但是,这总是会导致异常"无法创建类型'System.Tuple`2'的常量值.在此上下文中仅支持基本类型(例如Int32,String和Guid')."

Rap*_*aus 5

我想看一个更清洁的方法来做到这一点,但......至少它应该有效.

解决方法1

你需要什么:连接你的元组列表,然后使用SqlFunctions.StringConvert连接你的实体的"int键" .因为它只需要double或decimal作为参数,所以你必须首先将int转换为double.

List<Tuple<int, int>> ids = GetIds();

var concatenatedIds = ids.Select(m => m.Item1 + "," + m.Item2).ToList();

var result = ctx.CompositeEntities
                .Where(conatenatedIds.Contains(
                       SqlFunctions.StringConvert((double)m.KeyA) + 
                       "," + 
                       SqlFunctions.StringConvert((double)m.KeyB)));
Run Code Online (Sandbox Code Playgroud)

溶液2

使用PredicateBuilder

List<Tuple<int, int>> ids = GetIds();

var predicate = Predicate.False<CompositeEntity>();
foreach (var tuple in ids) 
   predicate = predicate.Or(m => m.KeyA == tuple.Item1 && m.KeyB == tuple.Item2);

var result = ctx.CompositeEntities.Where(predicate);
Run Code Online (Sandbox Code Playgroud)

Solution3

首先列举,然后进行比较.当然,这将从数据库中获取所有CompositeEntities.