EF代码优先:如何在多个表/实体上进行搜索

本文关键字:实体 搜索 代码 EF | 更新日期: 2023-09-27 18:12:48

我有4个不相关的实体,我想在它们中查询某个关键字。每个实体都有一个LastModified字段,我想按LastModified域的顺序返回4个表中搜索的前50个结果。这可能吗?

过去我用一个视图来做这种事情。。。但我不知道如何使用EF Code First来实现它

EF代码优先:如何在多个表/实体上进行搜索

您需要:

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

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

EDIT这种方法看起来像:

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支持的运算符和函数,那么从连接步骤中删除AsEnumerableTake调用,所有调用都可以在服务器端执行。