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')."
我想看一个更清洁的方法来做到这一点,但......至少它应该有效.
解决方法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
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.
| 归档时间: |
|
| 查看次数: |
1450 次 |
| 最近记录: |