C#Linq多或

C#Linq多或,c#,sql-server,linq,C#,Sql Server,Linq,我希望通过不调用同一查询的10.000次(实际数字)来优化查询调用 var myObject= _db.myObject.FirstOrDefault(x => x.property1 == param1 && x.property2 == param2 && x.property3 == 3); 所以我想 让我们将myOtherObject的列表传递给函数。myOtherObject包含通常填充参数1、2和3的字段 在普通查询中,我将在foreac

我希望通过不调用同一查询的10.000次(实际数字)来优化查询调用

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

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

在普通查询中,我将在foreach中创建一个字符串并对其进行concat。像这样:

            // WHERE (property1 = param1 && property2 = param2 && property3 = param3) OR (property1 = param1 && property2 = param2 && property3 = param3) OR (property1 = param1 && property2 = param2 && property3 = param3)
我如何在LINQ中归档(如果可能的话)相同的文件是否可以连接多个OR

当然,我用any试过concat,也试过where's,但这不起作用,因为它创建了and语句(逻辑上)

上下文

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

输入

列出ObjectA的(需要匹配3个字段)

输出


从另一个(只读)数据库中,我希望返回一个匹配对象的列表。

尽管可以使用为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();

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

对于将来面临此问题的人:我使用linq contains解决了这个问题

public async Task<List<MyObject>> GetMyObjectByListOfStrings(List<string> search)
    {
        var myObjects = await _db.Entity.Where(x => search.Contains(x.param1+ x.param2+ x.param3)).ToListAsync();
        return myObjects;
    }
公共异步任务GetMyObjectByListofString(列表搜索)
{
var myObjects=await_db.Entity.Where(x=>search.Contains(x.param1+x.param2+x.param3)).toListSync();
返回对象;
}

可能有更好的选择,应该更改的设计或应该修复的实际问题。

为什么不在数据库中创建一个参数化存储过程并使用它呢?这是一个完美的用例。我只能从这个数据库中读取。我不确定存储过程是否会被接受。谢谢你的想法!很抱歉,但是,当你问一个问题时,如果你想知道你已经做了什么,我们应该怎么做,那么你就要把注意力集中在你的输入/输出上。@JochemQuery:根据我的经验,如果你表现出性能提升>1000%,你通常会得到更多的认可;-)@Robert这是一个正确的观点。我现在正在创建它(它是用于更新方法的,所以它不直接可见)。所以我想如果他们抱怨,我会说我需要一个存储过程。:)@不客气!我很好奇你是否有机会尝试一下,这种方法是否成功?我今天考试而不是实习(我通过了:),所以我还没有检查。我不确定何时尝试这种方法,但我会在这里更新
public async Task<List<MyObject>> GetMyObjectByListOfStrings(List<string> search)
    {
        var myObjects = await _db.Entity.Where(x => search.Contains(x.param1+ x.param2+ x.param3)).ToListAsync();
        return myObjects;
    }