gpt4 book ai didi

C# Linq 多或

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:49 25 4
gpt4 key购买 nike

我想通过不调用 10.000 次(实际数字)相同的查询来优化我的查询调用。

   var myObject= _db.myObject.FirstOrDefault(x => x.property1 == param1 && x.property2 == param2 && x.property3 == 3);

我是这么想的

让我们将 myOtherObject 的列表传递给一个函数。 myOtherObject 包含通常填充 param1、2 和 3 的字段。

在普通查询中,我会在 foreach 中创建一个字符串并将其连接起来。像这样:

            // WHERE (property1 = param1 && property2 = param2 && property3 = param3) OR (property1 = param1 && property2 = param2 && property3 = param3) OR (property1 = param1 && property2 = param2 && property3 = param3)

我如何在 LINQ 中实现(如果可能)相同的结果。 是否可以连接多个 OR

当然,我尝试了 concat 和 any 并尝试了 where's 但这没有用,因为它创建了 AND 语句(逻辑上)。

上下文

我在自己的数据库中有一个对象。我需要与数据库中的另一个对象进行比较,我只有只读访问权限。我可以根据 3 个参数的组合来匹配两个对象。

输入

ObjectA 的

List(包含匹配所需的 3 个字段)

输出

我想要从其他(只读)数据库返回匹配对象的列表

最佳答案

尽管您可以使用 System.Linq.Expressions APIs 为 LINQ 构建表达式, 一种更简单的方法可能会起作用,具体取决于目标数据库中各个属性的选择性。

首先,请注意,如果另一组内存中的对象也在内存中,则查找与一组内存对象匹配的任务非常简单:

// Type parameters of Tuple<,,> depend on the types of Prop1..Prop3
var expect = new HashSet<Tuple<string,string,string>>(
targetList.Select(item => Tuple.Create(item.Prop1, item.Prop2, item.Prop3))
);
var matches = sourceList
.Where(item => expect.Contains(Tuple.Create(item.Prop1, item.Prop2, item.Prop3)))
.ToList();

由于上述方法在数据库搜索中不起作用,请考虑采用两阶段方法:

  1. 读取数据库以找到所有可能的“误报”匹配项
  2. 使用上述方法过滤掉误报。

您可以通过查询各个参数来获取具有误报的项目列表,如下所示:

var p1List = targetList.Select(item => item.Prop1).ToList();
var p2List = targetList.Select(item => item.Prop2).ToList();
var p3List = targetList.Select(item => item.Prop3).ToList();
var preliminary = dbContext.BigTable
.Where(item => p1List.Contains(item.Prop1)
&& p2List.Contains(item.Prop2)
&& p3List.Contains(item.Prop3))
.AsEnumerable();

只要数据库查询将列表减少到实际结果大小的十倍以下,这种方法就可以工作,因为内存查询在 CPU 使用率方面非常有效(它的效率是 O( M+N),其中M为误报列表的大小,N为目标列表的大小。

关于C# Linq 多或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43186011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com