0

基于此处的文档:http: //docs.composite.net/Data/AccessingDataWithCSharp/How-to-Query-Data-Using-LINQ#_How_to_Query

我需要使用 string[int1,int2,int3..] 类型的过滤器查询表中的数据,但不知道如何去做。

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

表“配置文件”(AGlobal.profile)包含列:

Id   Types(profile_accomtypes)
1    1,2
2    4,7
3    12,4,6
4    3,6,9

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

Id   Description(proptype_names)
1     The first description
2     The second description
........
12    The twelfth description

我创建了一个强编码类,使我能够轻松处理客户端提交的表单内容。表单中有几个多选(其中一个是上面 Profile 数据类型表中的“类型”。)每个多选都以序列化 JSON 格式传递给服务器,其中我是字符串。用逗号加入“类型”值分隔符保存到 Profile.Types 列。

现在,我想通过加载 Profile Id 的 Types string[] 并使用 int id 值过滤 TypeDesc 表以仅选择带有 Description 的 Type 值,从而将配置文件页面中的选择提供给客户端,以便我可以呈现描述作为客户端的项目符号列表。

配置文件表中的过滤器类型始终是 id 整数我使用的代码是:

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 中:

错误 = 无法将 lambda 表达式转换为 bool 类型,因为它不是委托类型。

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

我哪里错了?是否有一种更简洁的方法可以根据从 db 表中的列字段查询的逗号分隔列表过滤数据集?

提前感谢您的任何帮助/想法。马丁。

4

2 回答 2

2

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

    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>");
    }
于 2012-08-09T14:23:51.850 回答
0

一旦从原始 Linq 查询中拆分字符串 var(它标识了一个带有逗号分隔 id 号的连接字符串的单个字段)。我无法正确使用“包含”。我转换了第二个 Linq 查询 ToList 来评估集合。

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

依靠 Vimal Lakhera 发表的一篇文章:

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

这对我有用...

// 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 号在不同的集合中。

于 2012-08-11T15:28:36.650 回答