EF Code First:如何搜索多个表/实体?

时间:2011-10-29 11:10:09

标签: c# sql entity-framework

我有4个不相关的实体,我想查询它们是否有某个关键字。每个实体都有一个LastModified字段,我想通过LastModified字段返回搜索的前50个结果。这甚至可能吗?

过去我曾用过一个视图来做这种事情......但我不明白如何用 EF Code First 来实现它。

1 个答案:

答案 0 :(得分:7)

您需要:

  • 搜索每个表格
  • 将结果转换为通用类型
  • 合并结果
  • 从此合并列表中排序/选择
  • 取前50个结果。

前两个可以使用LINQ to Entities完成,后三个可以使用LINQ to Objects。

编辑此方法类似于:

var resA = from a in db.A
           where ConditionA(a)
           select MakeSharedFromA(a);
var resB = from b in db.B
           where ConditionB(b)
           select MakeSharedFromB(b);
var resC = from c in db.C
           where ConditionC(c)
           select MakeSharedFromC(c);
var resD = from d in db.D
           where ConditionD(d)
           select MakeSharedFromD(d);

var merged = resA.AsEnumerable().Take(50)
                 .Concat(resB.AsEnumerable().Take(50))
                 .Concat(resC.AsEnumerable().Take(50))
                 .Concat(resD.AsEnumerable().Take(50));

var res = merged.Sort(x => x.SortField).Take(50);

如果每个MakeSharedFromX方法都可以被lambda(给出表达式树)替换,该lambda仅限于LINQ to Entities支持的运算符和函数,那么删除AsEnumerable和{{ 1}}来自串联步骤的调用,所有都可以在服务器端执行。