基于此处的文档: http://docs.composite.net/Data/AccessingDataWithCSharp/How-to-Query-Data-Using-LINQ#_How_to_Query
我需要使用类型为string [int1,int2,int3 ..]的过滤器来查询表中的数据,并且无法确定如何进行操作。
字符串[]来自另一个表字段,该字段存储表单上多重元素的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数据类型表中的'Types'。)每个多选项都以序列化的JSON格式传递给服务器,其中我是字符串。用逗号表示'Types'值分隔符保存到Profile.Types列。
现在我想通过加载Profile Id的Types字符串[]并使用int id值来过滤TypeDesc表,只选择带有Description的Type值以便我可以在配置文件页面中为客户端提供选择,以便我可以将描述呈现为客户端上的项目符号列表。
Profile表中的过滤器类型始终是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中:
我也不知道如何将sTypes变量解析为int(如果需要),以便过滤器起作用:(
我哪里错了?有没有更简洁的方法来过滤数据集,而不是从db表中的列字段查询的逗号分隔列表?
提前感谢您提供任何帮助/想法。 马丁。
答案 0 :(得分: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>");
}
答案 1 :(得分:0)
将字符串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/ 我将结果集转换为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号。