Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ搜索varchar字段以构建建议列表_C#_Sql Server_Linq_Linq To Sql - Fatal编程技术网

C# 如何使用LINQ搜索varchar字段以构建建议列表

C# 如何使用LINQ搜索varchar字段以构建建议列表,c#,sql-server,linq,linq-to-sql,C#,Sql Server,Linq,Linq To Sql,我正在尝试使用表达式树构造LINQ查询,以执行以下操作: 我在ItemCode表中有一个名为Labels的字段,该字段中包含的数据示例是“lamps lighting Chandleir” 我希望允许用户输入一些文本,例如“红灯”,并能够搜索ItemCode表的标签字段,其中文本包含“红灯”或“灯” 我正在尝试向用户推荐选择,这虽然很基本,但却是很好的第一步。。。只需要一些构造查询的帮助 我使用CSLA作为我的框架,下面是我目前拥有的代码示例: IQueryable<Data.ItemCo

我正在尝试使用表达式树构造LINQ查询,以执行以下操作:

我在ItemCode表中有一个名为Labels的字段,该字段中包含的数据示例是“lamps lighting Chandleir”

我希望允许用户输入一些文本,例如“红灯”,并能够搜索ItemCode表的标签字段,其中文本包含“红灯”或“灯”

我正在尝试向用户推荐选择,这虽然很基本,但却是很好的第一步。。。只需要一些构造查询的帮助

我使用CSLA作为我的框架,下面是我目前拥有的代码示例:

IQueryable<Data.ItemCode> query = ctx.DataContext.ItemCodes;

//
// ItemCodeId
//
if (criteria.Name != null)
     query = query.Where(row => row.ItemCodeId.Contains(criteria.ItemCodeId));
//
// Name
//
if (criteria.Name != null)
     query = query.Where(row => row.Name.Contains(criteria.Name));

var data = query.Select(row => ItemCodeInfo.FetchItemCodeInfo(row));

this.AddRange(data);
IQueryable query=ctx.DataContext.ItemCodes;
//
//项目代码ID
//
if(criteria.Name!=null)
query=query.Where(row=>row.ItemCodeId.Contains(criteria.ItemCodeId));
//
//名字
//
if(criteria.Name!=null)
query=query.Where(row=>row.Name.Contains(criteria.Name));
var data=query.Select(行=>ItemCodeInfo.FetchItemCodeInfo(行));
此.AddRange(数据);

提前谢谢

编辑:更新以反映示例代码

假设您的Criteria对象有一个名为Labels的字段,该字段是搜索字符串(例如“红灯”),则:

这将选择标签字段包含条件搜索字符串中任何单词的行。它假定单词在标签字段和条件字符串中都由空格分隔。它不会进行部分单词匹配,例如,如果提供的搜索字符串为“red lamp”,它将找不到标签为“redlamp”的记录。

string searchString=“red lamp”;
String searchString = "red LAMP";

String[] searchStringParts = searchString.
   ToUpperInvariant().
   Split(new Char[] {' '}, StringSplitOptions.RemoveEmptyEntries);

IEnumerable<ItemCode> resultSet = itemCodes.
   Where(itemCode => searchStringParts.
      Any(part => itemCode.Labels.ToUpperInvariant().Contains(part)));
String[]searchStringParts=searchString。 Toupper不变量()。 拆分(新字符[]{''},StringSplitOptions.RemoveEmptyEntries); IEnumerable resultSet=项目代码。 其中(itemCode=>searchStringParts)。 任何(part=>itemCode.Labels.ToUpperInvariant().Contains(part));
这将与LINQ to对象一起使用。由于调用
ToUpperInvariant()
的原因,可能不使用LINQ to SQL。在这种情况下,您可以省略规范化(导致搜索质量差)或存储规范化的标签。或者,您可以添加一个
ToList()
调用,获取所有项目并在客户端计算机上进行处理。

这无法完成


我们已经决定您使用存储过程路线来实现此高级功能。谢谢大家的意见

@Joe我提供了我当前代码的示例。。。只是想弄清楚我将如何应用您的建议。@Joe尝试这样做:if(criteria.Labels!=null)query=query.Where(row=>row.Labels.Split(“”).Intersect(criteria.Labels.Split(“”)).Count()>0@Joe遇到以下错误:除了Contains()运算符外,查询运算符的LINQ to SQL实现中不能使用本地序列。啊,LINQ to SQL抱怨它无法访问通过拆分条件字段创建的本地序列。您的数据集有多大?您可以将其更改为query.ToList()。其中。。。如果不是特别大/是否有理由将一组字符串存储在一列中,而不是使用标签表进行规范化?
String searchString = "red LAMP";

String[] searchStringParts = searchString.
   ToUpperInvariant().
   Split(new Char[] {' '}, StringSplitOptions.RemoveEmptyEntries);

IEnumerable<ItemCode> resultSet = itemCodes.
   Where(itemCode => searchStringParts.
      Any(part => itemCode.Labels.ToUpperInvariant().Contains(part)));