【问题标题】:Dynamic Linq OR with int and string动态 Linq OR 与 int 和 string
【发布时间】:2015-05-21 07:57:10
【问题描述】:

我有一个非常简单的查询,看起来像这样

select      *
from        job
where       jobId like '%23%'
or title    like '%23%'

我需要能够使用动态 Linq 复制它

我最接近的是这个,但它不起作用

.Where("@0.Contains(jobId) or title.Contains(@0)", "23");

有没有人解决这个问题,理想情况下我希望它在 int 和字符串上都做类似

基于 cmets 的附录

错误是:

System.Linq.Dynamic.dll 中出现“System.Linq.Dynamic.ParseException”类型的异常,但未在用户代码中处理附加信息:“String”类型中不存在适用的方法“Contains”

jobId 字段是 int,而 titlevarchar

【问题讨论】:

  • 你为什么使用@0.Contains(jobId)?在这种情况下,@0 放置了“23”,所以它看起来像 "23".Contains(jobld)
  • 你试过.Where(x=>x.jobId.ToString().Contains("23") || title.Contains("23");吗?
  • @Hintham 使用动态 linq,所以传递字符串而不是表达式
  • @Grundy 你是对的,忽略了 OP 对使用动态 Linq 的要求

标签: c# linq dynamic-linq


【解决方案1】:

您的查询几乎是正确的:

.Where("@0.Contains(jobId.ToString()) or title.Contains(@0)", "23")

实体框架(我希望你正在使用它)正确地将jobId.ToString() 更改为CAST( [Extent1].[Id] AS nvarchar(max))...然后它使用CHARINDEX 而不是LIKE,但这不是问题。

我在 SQL Server 上使用 Entity Framework 6.1.3 得到的查询是:

SELECT 
    [Extent1].[jobId] AS [jobId], 
    [Extent1].[title] AS [title]
    FROM [dbo].[job] AS [Extent1]
    WHERE (( CAST(CHARINDEX( CAST( [Extent1].[jobId] AS nvarchar(max)), N'23') AS int)) > 0) OR ([Extent1].[title] LIKE N'%23%')

【讨论】:

  • 输入了我的示例,我传递了一个字符串作为参数。
  • System.Linq.Dynamic.dll 中发生“System.Linq.Dynamic.ParseException”类型的异常,但未在用户代码中处理附加信息:“类型”中不存在适用的方法“包含”字符串'
  • 实际代码是 filterQuery = filterQuery.Where(where, filter); where = "@0.Contains(jobId) or title.Contains(@0)" and filter = "118"
  • 没有 jobId 是 int 并且 title 是 varchar,因此我的标题是“Dynamic Linq OR with int and string”
  • “23”和int id = 23没有区别; id.ToString();
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2011-02-10
  • 2010-11-21
  • 2020-04-21
相关资源
最近更新 更多