当前位置: 首页 > 面试题库 >

如何动态组合linq查询?

潘佐
2023-03-14
问题内容

假设我有一个表,在字符串(nvarchar)列中包含格式化的值。这些值应该是由某些const符号分隔的字符串(让它是分号;)。例如,

12;0;5;dog //four values separated by a semi-colon

或者

053 //if there is only one value, no semi-colon at the end

分隔符始终是分隔符,不能是值的一部分。

我需要检查该表中是否已经有一行,并且该列中的值列表至少包含指定的一项。换句话说,我有一个值列表:

List<string> list = new List<string>() { "somevalue1", "somevalue2" };

分隔符:

string separator = ";";

我需要编写一个执行此操作的linq-to-sql查询:

select ... from sometable
where Value='somevalue1' or Value like 'somevalue1;%' or
      Value like '%;somevalue1' or Value like '%;somevalue1;%'

   or Value='somevalue2' or Value like 'somevalue2;%' or 
      Value like '%;somevalue2' or Value like '%;somevalue2;%'

应该提到的是,任何搜索值都可以包含其他值。也就是说,我可能正在精确搜索5,而某行可能包含1;15;55。这样的行 不能
匹配。While...;5;...或just 5,或5;...或是...;5匹配项。

使用linq-to sql我知道如何进行以下类型的查询:

select ... from sometable where (... or ... or ...) and (... or ...) ...

那是

IQueryable<SomeTable> query = dc.SomeTable;
foreach (string l in list)
{
    string s = l;
    query = query.Where(b => b.Value.StartsWith(s + separator) ||
                             b.Value.EndsWith(separator + s) ||
                             b.Value.Contains(separator + s + separator) ||
                             b.Value.Equals(s));
}
if (query.Any()) {/*...*/}

显然,这些Where语句AND在生成的sql查询中加入了,而我却OR无所不在。

那么有没有办法在C#代码中获取我需要的查询?还是唯一的方法是使用手写查询和DataContext.ExecuteQuery方法来执行此操作?


问题答案:

我想一个UNION将满足您的需求:

IQueryable<SomeTable> baseQuery = dc.SomeTable;
IQueryable<SomeTable> query = new List<SomeTable>().AsQueryable();
foreach (string l in list)
{
    string s = l;

    query.Union(baseQuery.Where(b => b.Value.StartsWith(s + separator) ||
                             b.Value.EndsWith(separator + s) ||
                             b.Value.Contains(separator + s + separator) ||
                             b.Value.Equals(s)));
}
if (query.Any()) {/*...*/}


 类似资料:
  • 问题内容: 我正在使用c#中的linq查询遇到一个问题,我的linq查询如下 我有一个 perfmon 类,它包含诸如(id,counter1,counter2 …)之类的属性,现在有20多个计数器,我已经开发了sql查询以根据参数中传递的计数器名称选择id和计数器,例如,如果我已经传递了counter1,它将仅选择id,counter1(重命名为counter) 如果我将在这里使用开关盒,那么它

  • 问题内容: 作为一个非C#精通的程序员,我对LINQ查询的评估语义感到好奇,如下所示: 假设这是一个定义了and字段的ADO实体,那么从数据库的角度来看,这将做什么?具体来说,是否将运行查询以生成内存中的结构,然后由查询查询该结构?还是仅从中提取有关查询的数据,然后产生一个新的数据库对等查询的结构?因此,如果我遍历这两个查询,将执行多少个SQL语句? 问题答案: 它们是可组合的。这是可能的,因为L

  • 我们有一个API来处理来自不同来源的数据(数据库、webservices、纯文本、...)所以我们将它存储在列表结构中。我们有这段代码来选择它们中的一些列,并应用函数来获取新数据(如和两列,...) 在上面的代码中:LeftDataquery是一个获取列表的类,其中的数据执行此操作,并返回 LeftFuncions是从源数据创建新数据的公式,“lefdataquery[1]+lefdataquer

  • 问题内容: 这些天,我正在实施一个系统,我想实施一个组合框选择过程,但我不知道如何实施,所以请你们帮忙吗? 我的情况是这样的,假设我们有两个组合框选择列表,左一个和右一个,左一个是主列表,右一个是左一个的子列表。 当我从左组合框中选择一个项目时,应根据左组合的选择来更改右组合框的内容, 例:让我们考虑一下手机,如果我选择品牌 从左侧组合框,右侧组合框的内容应更改为 像明智的。请帮助我实现这种情况!

  • 我在工作表上使用“生成”按钮。当我单击按钮时,会出现一个弹出窗口(表单),其中包含两个组合框。根据第一个组合框中的选择,填充第二个组合框选项列表。 对于第一个组合框,当我对项目值进行硬编码时,它工作正常。表单代码如下: 我尝试使用以下表单代码从Excel工作表中的列中获取组合框项目值,从而使此项目列表动态化: 但是上面的代码抛出错误:运行时错误“1004”:对象“_Global”的方法“范围”失败

  • 问题内容: 从一个示例中,您可以看到一个多重或查询过滤器: 例如,这导致: 但是,我想从列表中创建此查询过滤器。怎么做? 例如 问题答案: 你可以按以下方式链接查询: