【问题标题】:Query data using "Contains" keyword in Dynamic Linq in C#在 C# 中的 Dynamic Linq 中使用“包含”关键字查询数据
【发布时间】:2013-03-16 00:17:24
【问题描述】:

在 C# 的动态 linq 中执行具有“包含”关键字的查询时,我遇到了一些问题。我收到以下错误

“Int32”类型中不存在属性或字段

我的代码如下:

如果我为数据类型字符串字段使用“包含”关键字,那么它可以正常工作,如下所示

string[] CandidateNamesArray = new string[]{"Ram", "Venkat", "Micheal"}
var dynamicLinqQuery = Candidates.Where("CandidateName.Contains(@0)", CandidateNamesArray );
  • 工作正常

但如果我对数据类型 int 字段使用“包含”关键字,则会引发如下异常

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = Candidates.Where("CandidateId.Contains(@0)", CandidateIdsArray);

运行时异常 - “类型中不存在适用的方法‘包含’ 'Int32'"

还尝试了以下另一种方式

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = Candidates.Where("@0.Contains(CandidateId)", CandidateIdsArray);

运行时异常 - “类型中不存在属性或字段‘CandidateId’ 'Int32'"

我花了将近 2 天的时间来解决上述问题,但未能成功。任何人都可以帮我解决上述问题...在此先感谢

【问题讨论】:

  • 错误非常清楚地说明了问题。 String 有一个名为 Contains 的方法,它检查字符串是否包含您指定给该方法的字符序列。 Int32 没有名为Contains 的方法,这样的方法会做什么?那是你的第一个错误。在第二个中,您在int[] 上尝试Contains 方法。没有这样的方法(有一个扩展方法)。试试List<int> 看看你是否有更好的运气。
  • 看起来您的第三个示例应该可以工作。你确定你有Candidates.Where(...) 而不是CandidateIdsArray.Where(...) 吗?
  • @venkat,你试过List<int>吗?
  • 我已尝试使用 List,但以相同的异常“Int32 类型中不存在属性或字段 'CandidateId'”结束。在第三个示例中,它是 CandidateIdsArray.Where(...)
  • 等等,如果在第三个样本中你有CandidateIdsArray.Where(...),那就是问题所在!把Candidate.Where(...)放在那里。

标签: c# linq dynamic


【解决方案1】:

您可以使用将数组转换为字符串,然后使用 Contains() 将其转换回 int

【讨论】:

  • 谢谢,但在查询中,我使用数据库实体对象字段“CandidateId”进行过滤,该字段的数据类型为 int,我无法更改。并且需要使用 int 数组值列表过滤这个 CandidateId,我该怎么做?
  • @venkat 你不能做类似 var query = from can in Candidates select new { can.CandidateId.ToString()};然后在查询中添加 Where()?
  • 让我详细解释一下...我的整个代码如下 //1st Linq query IQueryable obj_Query = (from c in vvEntity.Candidates.ToList() join p in vvEntity. c.CandidateId 上的 view_Candidate_Attributes.ToList() 等于 p.CandidateId 在 c.CandidateId 上的 view_Geographies.ToList() 中加入 q 等于 q.CandidateId 选择新 { c.CandidateId, c.CandidateName, q.FirstName, q.LastName, c. CreatedOn, c.ModifiedOn }).ToList().AsQueryable();
  • //使用第一个 Linq 查询的结果集的第二个动态 Linq 查询。我选择了动态 linq 查询作为条件是动态的参数。 var dynamicLinqQuery = obj_Query.Where("@0.Contains(CandidateId)", CandidateIdsArray);如果我想在上面执行正常的 linq,请按以下方式尝试,但字段名称未出现(Intellisense 未在下面的代码中显示 c.fieldnames)var NormalLinqQuery = obj_Query.Where(c => c.CandidateIdsIntArray.Contains(c.候选人ID)); //语法错误:c.CandidateId 现在你能建议我如何继续吗?
  • @venkat 好吧,我想动态 linq 有很多东西可以使用。您应该尝试使用 IQuerable 表达式 (msdn.microsoft.com/en-us/library/…) 来实现您的代码,例如 Expression> expression = c => return CandidateIdsArray.Contains(c.CandidateId);
【解决方案2】:

看起来你检查错了。在第一个查询中,您实际上检查字段“CandidateName”是否包含另一个字符串,并且有效。但在第二个示例中,您检查字段“CandidateId”是否包含另一个 int。而且 int 不能包含另一个 int,所以会出错。

编辑:

看起来在第三个示例代码中并且异常不匹配。如果代码为:

,您将收到异常 "No property or field 'CandidateId' exists in type 'Int32'"
int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = 
      CandidateIdsArray.Where("@0.Contains(CandidateId)", CandidateIdsArray);

但是您提供的代码看起来是正确的,应该可以工作:

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = 
      Candidates.Where("@0.Contains(CandidateId)", CandidateIdsArray);

【讨论】:

  • 谢谢,在第二个示例中,我正在检查与 int 数组中的 ID 匹配的候选 ID。我怎么能这样做?建议是否有其他方式?
  • 没有动态 linq 是否一切正常?只需int[] CandidateIdsArray = new int[]{4, 78, 101} var dynamicLinqQuery = Candidates.Where(c=>CandidateIdsArray.Contains(c.CandidateId));
  • 是的,您的代码在没有动态 linq 的情况下一切正常。但我只需要使用动态 linq,因为我在条件始终是动态的情况下使用的列。
【解决方案3】:

我不知道 Dynamic Linq,但对我来说很明显类型 Int32 不包含任何名为 Contains 的方法。在调用Contains 之前将其转换为string 怎么样?

var dynamicLinqQuery = Candidates.Where("CandidateId.ToString().Contains(@0)", CandidateIdsArray);

【讨论】:

  • 我已按照您的建议尝试,以以下异常结束“异常:LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且此方法无法转换为存储表达式。”
【解决方案4】:

我知道你的帖子已经很久了,但我今天遇到了同样的问题。

我在Contains 内的属性之前使用outerIt 解决了它。

在你的例子中:

int[] CandidateIdsArray = new int[]{4, 78, 101}
var dynamicLinqQuery = Candidates.Where("@0.Contains(outerIt.CandidateId)", CandidateIdsArray);

它对我有用,因为 DynamicLinq 认为 CandidateId 是数组对象的属性。而使用outerIt让它明白了它指的是外层迭代器,也就是Candidate。

【讨论】:

  • 谢谢。这正是我需要的解决方案。 “外在”
  • "outerIt" 在旧版本的库中不起作用。确保您使用的是 newet one
  • 这正是我需要的解决方案。 “outerIt”节省了我的时间,谢谢
【解决方案5】:

尝试以下方法:

var validCandidateIds = new List<int>(){4, 78, 101};
var filteredCandidates = Candidates.Where(
    "@0.Contains(CandidateId)", validCandidateIds);

应该等于(但可能慢于):

var validCandidateIds = new List<int>(){4, 78, 101};
var filteredCandidates = Candidates.Where(
    c => validCandidateIds.Contains(c.CandidateId));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 2014-07-01
    • 2013-09-27
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2023-04-02
    相关资源
    最近更新 更多