【问题标题】:How to implement the sql "%" in EF?如何在EF中实现sql“%”?
【发布时间】:2012-03-23 10:20:17
【问题描述】:

我想做的是:

var TheQuery = db.Conventions.Where(p => p.Categories.Contains("%"));

但它没有从数据库返回!

【问题讨论】:

  • 该查询应该返回所有包含% 的行。如果这不是您所期望的,您能否更好地解释您的用例...?
  • 您是否尝试在其类别字段中的某处查找带有“%”字符的约定?
  • 您要搜索名为“%”的类别还是任何类别(例如 SELECT * FROM CATS WHERE CATS.NAME LIKE %)。在后一种情况下,您可以使用 p.Categories.Any()
  • 我有一个包含多个字段的搜索表单,如果它是一个空字符串,我想要做的是分配给变量的内容。 `if(Request["Categorie"]!="") categorie = Request["Categorie"];其他'类别=“%”; //选择所有类别 var TheQuery = db.Conventions.Where(p => p.Categories.intituleCategorie.Contains(categorie) );

标签: c# sql-server entity-framework linq-to-entities


【解决方案1】:

根据您对 DaveShaw 的评论,我认为您应该这样做:

IQueryable<Convention> query = db.Conventions;
if (!string.IsNullOrWhiteSpace(inputCategory))
{
    query = query.Where(p => p.Categories.Contains(inputCategory));
}
if (!string.InNullOrWhiteSpace(inputName))
{
    query = query.Where(p=> p.Name == inputName);
}

等等

现在,如果您想确保您的 Convention 至少有一个类别,您可以改用 .Any()

if (string.IsNullOrWhiteSpace(inputCategory))
{
    query = query.Where(p => p.Categories.Any());
}

或者如果它应该有任何具有特定名称的类别

if (!string.IsNullOrWhiteSpace(inputCategory))
{
    query = query.Where(p => p.Categories.Any(c => c.Name.Contains(inputCategory));
}

在您对其调用 ToArray、ToList 或 ToEnumerable(或任何其他需要客户端评估的方法)之前,不会执行实际查询。只要您坚持对 Query 对象进行纯 LINQ 调用,您就可以继续坚持使用 where 子句,直到您满意为止。

【讨论】:

  • 问题是我需要为多个字段(其他 24 个字段)这样做
  • 所以添加 24 个 if。这比向数据库发送过于复杂的查询要好。
  • 请注意(根据我的实践)。Any() 会生成一个巨大的数据库请求。小心它。
【解决方案2】:

SQL“%”?您是指与 LIKE 一起使用时吗?如果是这样,只需使用.Contains("Products") 带回类别,例如:

carProducts
houseProducts2

即包含将带回类别属性/字段“包含”字符串的结果,无论它的任一侧是什么。

或者您的意思是您希望类别包含字符“%”? (你现在成功了)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多