首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ C#和Filter string[]数组查询数据?

使用LINQ C#和Filter string[]数组查询数据?
EN

Stack Overflow用户
提问于 2012-08-09 13:50:35
回答 2查看 7.1K关注 0票数 0

基于这里的文档:Query

我需要使用stringint1、int2、int3类型的过滤器查询表中的数据。也想不出该怎么做。

string[]来自一个不同的表字段,该字段在窗体上存储多选择元素的id值:

表'Profile‘(AGlobal.profile)包含列:

代码语言:javascript
复制
Id   Types(profile_accomtypes)
1    1,2
2    4,7
3    12,4,6
4    3,6,9

然后我有一个静态表'TypeDesc‘(ALocal.proptype),列出了总共12个'Type’值:

代码语言:javascript
复制
Id   Description(proptype_names)
1     The first description
2     The second description
........
12    The twelfth description

我创建了一个强编码类,使我能够轻松地处理来自客户端提交的表单内容。表单中有一对多选择(其中之一是配置文件数据类型表中的“Types”)。每个multiselects以序列化的JSON格式传递给服务器,其中我使用逗号分隔符string.Join 'Types‘值,以保存到Profile.Types列中。

现在,我希望通过加载配置文件Id的string[]类型,并使用int值过滤TypeDesc表,只选择带有说明的类型值,从而向客户端提供配置文件页面中的选择,以便将描述呈现为客户端上的项目列表。

Profile表中的筛选器类型总是id整数,我使用的代码是:

代码语言:javascript
复制
var myProftype =
   (from d in connection.Get<AGlobal.profile>() // find multiselected type string values
   where d.Id == StUserSet.utoken
   select d).First();
   string sProftype = myProftype.profile_accomtypes;                
   string[] sTypes = sProftype.Split(',');

// now filter proptypes to sTypes
var myTAccomtypes =
   (from d in connection.Get<ALocal.proptype>() // get all the types from the DB
   where(r => sTypes.Contains(r.Field<int>("Id"))) //Lambda ?
   select d).All;

StringBuilder sb = new StringBuilder(0); //create a bullet list string
// Loop over strings
    foreach (string s in myTAccomtypes)
    {
          sb.append("<dd>"+ s +"</dd>");
    }
   TuAccomtypes = sb.ToString();  // pass string to JQuery Taconite as part of AJAX response to alter DOM.

我在Lambda试图过滤我的类型时出错了。在VS2010中:

Error =不能将lambda表达式转换为bool类型,因为它不是委托类型。

我也不知道如何将sTypes变量解析为int (如果需要的话),以便过滤器工作:(

我哪里出问题了?是否有更干净的方法来针对从db表中的列字段中查询的逗号分隔列表筛选数据集?

谢谢你事先提供的任何帮助/想法。马丁。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-11 15:28:36

一旦将字符串var从原始的Linq查询中分离出来(该查询用逗号分隔的id数的联合字符串标识单个字段)。我无法正确地使用“包含”。我抛出了第二个Linq查询ToList,它评估了集合。

然后,我没有使用完整的结果,而是将结果限制在id和name字段中。

依靠Vimal Lakhera的一篇文章:

http://www.c-sharpcorner.com/uploadfile/VIMAL.LAKHERA/convert-a-linq-query-resultset-to-a-datatable/ I将结果集转换为一个DataTable,它允许轻松循环和选择字段,将其作为html字符串输出,作为JQuery Taconite回调的一部分。

这是对我有用的..。

代码语言:javascript
复制
// now filter proptypes to selected Types|
var myTAccomtypes = from d in connection.Get<ALocal.proptype>().ToList()
    // ToList() will evaluate collection, you cannot pass sTypes array of integers to a sql query, at least not in that way
    where sTypes.Contains(d.proptype_id.ToString())
    select new { d.proptype_id, d.proptype_name };

    DataTable AcomType = LINQToDataTable(myTAccomtypes);

    StringBuilder sb = new StringBuilder();
    // Loop over table rows
    foreach (var row in AcomType.Rows.OfType<DataRow>().Take(19))  // will .Take up to a maximum of x rows from above
    {
         sb.Append("<dd>");
         sb.Append(row["proptype_name"].ToString());
         sb.Append("</dd>");
     }
     HldUserSet.TuAccomtypes = sb.ToString();
     //HldUserSet.TuAccomtypes = string.Join(",", myTAccomtypes); //Check query content

使用Vimal的“LINQToDataTable”和LINQ请求中的调整意味着我可以非常快地在站点的许多地方使用这个类。

这对于那些使用"2,7,14,16“形式的单个连接id字符串的人来说是一个不错的选择,这些字符串需要被拆分,然后用于对更广泛的集合进行筛选,将id从字符串中匹配起来,以便在不同的集合中记录id号。

票数 0
EN

Stack Overflow用户

发布于 2012-08-09 14:23:51

我不太确定你的模型,但我认为这对你有用。我改变了你的linq,并结合了一些陈述。我还将Id字段转换为string,以便在array.Contains()函数中正确找到该字段。您可能希望将字符串转换为ints并以这种方式进行比较,但这取决于您。

代码语言:javascript
复制
    var myProftype = profiles.First(p => p.Id == StUserSet.utoken);
    string sProftype = myProftype.profile_accomtypes;
    string[] sTypes = sProftype.Split(',');
    var myTAccomtypes = propTypes.Where(r => sTypes.Contains(r.Field<int>("Id").ToString()));
    StringBuilder sb = new StringBuilder(0);

    foreach (PropType s in myTAccomtypes)
    {
        sb.Append("<dd>" + s.Description + "</dd>");
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11884976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档