【急】已经焦头烂额,200分请各位帮我解决问题。

zj25810 2014-07-01 10:57:44

//IEnumerable<DataRow> x = from result in dt.AsEnumerable()
// select result;
//if (typeid > 0)
// x = x.Where(p => p.Field<int>("typeid") == typeid);
//if (quest != "")
//{
// string[] arr = quest.Split('|');
// if (arr.Length > 2)
// {
// if (arr[1] != "")
// x = x.Where(p => p.Field<string>(arr[0]).Contains(arr[1]));
// else
// x = x.Where(p => p.Field<string>(arr[0]) != "");
// }
// else
// x = x.Where(p => p.Field<string>(arr[0]) != "");
//}
//if (typeid > 0)
// x = x.Where(p => p.Field<int>.typeid == typeid);


//if (quest != "")
//{
// string[] arr = quest.Split('|');
// if (arr.Length > 2)
// {
// if (arr[1] != "")
// x = x.Where(p => p.Field<string>(arr[0]).Contains(arr[1]));
// else
// x = x.Where(p => p.Field<string>(arr[0]) != "");
// }
// else
// x = x.Where(p => p.Field<string>(arr[0]) != "");
//}

//dt = trans.ToDataTable(x,dt.Rows[0]);

var x = (from result in dt.AsEnumerable()
select new
{
id = result.Field<int>("id"),
categoryid = result.Field<int>("categoryid"),
typeid = result.Field<int>("typeid"),
title = result.Field<string>("title"),
author = result.Field<string>("author"),
sourcesite = result.Field<string>("sourcesite"),
sourceurl = result.Field<string>("sourceurl"),
summary = result.Field<string>("summary"),
ext_fields = result.Field<string>("ext_fields"),
images = result.Field<string>("images"),
m_details = result.Field<string>("m_details"),
keywords = result.Field<string>("keywords"),
addtime = result.Field<int>("m_details")
}).ToList();

ToDataTable 方法

public DataTable ToDataTable<T>(IEnumerable<T> varlist)
{
DataTable dtReturn = new DataTable();
// column names
PropertyInfo[] oProps = null;
if (varlist == null)
return dtReturn;
foreach (T rec in varlist)
{
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType;
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
== typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[0];
}
dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
}
DataRow dr = dtReturn.NewRow();
foreach (PropertyInfo pi in oProps)
{
dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
(rec, null);
}
dtReturn.Rows.Add(dr);
}
return dtReturn;
}

注释掉的代码查询都没问题,不过调试跑到ToDataTable方法的这一步,没有转换成我原dt的指定类型,
就是说原来的dt.Rows[0]["id"]是有值的,经过Linq和ToDataTable之后,dt.Rows[0]["id"]报错,没有指定id类型。

然后换ToList(),完全卡在这里不会了。第一次接触Linq,不会,求指点。

...全文
4442 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zj25810 2015-06-05
  • 打赏
  • 举报
回复
派分吧,我都忘了这个鬼是怎么解决的。不过大家都认真回答了我的问题,不能让大家白来了。
rocly 2014-07-17
  • 打赏
  • 举报
回复
save4me 2014-07-09
  • 打赏
  • 举报
回复
你能把你的数据源JSON文件发出来看一下吗?如果不方便公开,可以不要真实数据,但是格式什么的要一样,这样方便大家调试。
zj25810 2014-07-09
  • 打赏
  • 举报
回复
引用 9 楼 wanghui0380 的回复:
当然还有另外解法,不管那些东西,先把你那东西直接json一下,然后在json2dt 就ok
这个能给我详细说一下吗?因为我最开始的数据源就是Json文件,然后我才转DataTable做处理的。
zj25810 2014-07-09
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
1.linq不是万能滴 2.好好看看msdn上datatable那么多方法是干嘛用第 dt.select dt.RowFilter dataview.totalbe 3.如果你实在不愿意用dt自己的方法,觉着linq就是高大上,那么请看 System.Data.DataTable dt = new System.Data.DataTable(); dt.AsEnumerable(). AsDataView().ToTable();
实在不是说Ling高大上什么的,经测试,DataTable.Select没有Linq高效,dt.RowFilter又不满足我的功能需求。 dataview.totalbe我倒是没有去了解它。
save4me 2014-07-09
  • 打赏
  • 举报
回复
Json.NET 支持手动通过LINQ读写JSON 使用参考: Json.Net系列教程 4.Linq To JSON,文章提供了查增删改的例子。
引用 13 楼 zj25810 的回复:
[quote=引用 12 楼 save4me 的回复:] 你能把你的数据源JSON文件发出来看一下吗?如果不方便公开,可以不要真实数据,但是格式什么的要一样,这样方便大家调试。
{"id":1,"name":"name1"},{"id":2,"name":"name2"},{"id":3,"name":"name3"},{"id":4,"name":"name4"},{"id":5,"name":"name5"} 就是类似这样的一个格式。不过id和name这种类型不会写死[/quote]
zj25810 2014-07-09
  • 打赏
  • 举报
回复
引用 12 楼 save4me 的回复:
你能把你的数据源JSON文件发出来看一下吗?如果不方便公开,可以不要真实数据,但是格式什么的要一样,这样方便大家调试。
{"id":1,"name":"name1"},{"id":2,"name":"name2"},{"id":3,"name":"name3"},{"id":4,"name":"name4"},{"id":5,"name":"name5"} 就是类似这样的一个格式。不过id和name这种类型不会写死
zj25810 2014-07-01
  • 打赏
  • 举报
回复
引用 3 楼 q107770540 的回复:
参考我之前的一篇blog: http://blog.csdn.net/q107770540/article/details/6556210
文章我看了,那我ToList()后的查询条件怎么拼? 我还有

//if (typeid > 0)
            //    x = x.Where(p => p.Field<int>("typeid") == typeid);
            //if (quest != "")
            //{
            //    string[] arr = quest.Split('|');
            //    if (arr.Length > 2)
            //    {
            //        if (arr[1] != "")
            //            x = x.Where(p => p.Field<string>(arr[0]).Contains(arr[1]));
            //        else
            //            x = x.Where(p => p.Field<string>(arr[0]) != "");
            //    }
            //    else
            //        x = x.Where(p => p.Field<string>(arr[0]) != "");
            //}
两个查询需要实现,又不能直接写在Linq语句里面,因为我需要判断是否用到这个查询
q107770540 2014-07-01
  • 打赏
  • 举报
回复
q107770540 2014-07-01
  • 打赏
  • 举报
回复
你的问题很简单,此处不要使用匿名类即可: select new YourClassName { id = result.Field<int>("id"), categoryid = result.Field<int>("categoryid"), typeid = result.Field<int>("typeid"), title = result.Field<string>("title"), author = result.Field<string>("author"), sourcesite = result.Field<string>("sourcesite"), sourceurl = result.Field<string>("sourceurl"), summary = result.Field<string>("summary"), ext_fields = result.Field<string>("ext_fields"), images = result.Field<string>("images"), m_details = result.Field<string>("m_details"), keywords = result.Field<string>("keywords"), addtime = result.Field<int>("m_details") }).ToList();
zj25810 2014-07-01
  • 打赏
  • 举报
回复
//dt = trans.ToDataTable(x,dt.Rows[0]);这行注释原来写的是//dt = trans.ToDataTable(x);大家不用纠结这里的问题
wanghui0380 2014-07-01
  • 打赏
  • 举报
回复
当然还有另外解法,不管那些东西,先把你那东西直接json一下,然后在json2dt 就ok
wanghui0380 2014-07-01
  • 打赏
  • 举报
回复
1.linq不是万能滴 2.好好看看msdn上datatable那么多方法是干嘛用第 dt.select dt.RowFilter dataview.totalbe 3.如果你实在不愿意用dt自己的方法,觉着linq就是高大上,那么请看 System.Data.DataTable dt = new System.Data.DataTable(); dt.AsEnumerable(). AsDataView().ToTable();
我现在在路上 2014-07-01
  • 打赏
  • 举报
回复
引用 6 楼 zj25810 的回复:

 public void Test() 
        {
            List<Miss> missList = new List<Miss>() {
                new Miss() { Id = 1, Name = "1" }, 
                new Miss() { Id = 2, Name = "2" }, 
                new Miss() { Id = 4, Name = "4" }, 
                new Miss() { Id = 5, Name = "5" }, 
                new Miss() { Id = 3, Name = "3" } 
            };
            var mm = from mis in missList
                     where mis.Id > 2
                     select mis;
            DataTable dt = ToDataTable(mm.ToList());


            string name = dt.Rows[0]["Name"].ToString();


            var x = from m in dt.AsEnumerable()
                    select new
                    {
                        id = m.Field<int>("Id"),
                        Name = m.Field<string>("Name"),
                    };

            foreach( var i in x)
            {
                Response.Write(string.Format("id:{0},name:{1}   ",i.id,i.Name));
            }
            
           
        }
输出正常。 没有你说的问题啊
zj25810 2014-07-01
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 4 楼 zj25810 的回复:] [quote=引用 3 楼 q107770540 的回复:] 参考我之前的一篇blog: http://blog.csdn.net/q107770540/article/details/6556210
文章我看了,那我ToList()后的查询条件怎么拼? 我还有

//if (typeid > 0)
            //    x = x.Where(p => p.Field<int>("typeid") == typeid);
            //if (quest != "")
            //{
            //    string[] arr = quest.Split('|');
            //    if (arr.Length > 2)
            //    {
            //        if (arr[1] != "")
            //            x = x.Where(p => p.Field<string>(arr[0]).Contains(arr[1]));
            //        else
            //            x = x.Where(p => p.Field<string>(arr[0]) != "");
            //    }
            //    else
            //        x = x.Where(p => p.Field<string>(arr[0]) != "");
            //}
两个查询需要实现,又不能直接写在Linq语句里面,因为我需要判断是否用到这个查询[/quote] 搜 linq 查询表达式目录树 http://developer.51cto.com/art/200909/151787.htm[/quote] 很抱歉,我又看得晕头转向。以我靠昨天一天理解的Linq知识,这种深层次的,我完全看不懂。 我现在只求能有效地针对Datatable进行操作,能够相关查询,并且转回Datatable无误就OK了。因为项目比较赶。
exception92 2014-07-01
  • 打赏
  • 举报
回复
引用 4 楼 zj25810 的回复:
[quote=引用 3 楼 q107770540 的回复:] 参考我之前的一篇blog: http://blog.csdn.net/q107770540/article/details/6556210
文章我看了,那我ToList()后的查询条件怎么拼? 我还有

//if (typeid > 0)
            //    x = x.Where(p => p.Field<int>("typeid") == typeid);
            //if (quest != "")
            //{
            //    string[] arr = quest.Split('|');
            //    if (arr.Length > 2)
            //    {
            //        if (arr[1] != "")
            //            x = x.Where(p => p.Field<string>(arr[0]).Contains(arr[1]));
            //        else
            //            x = x.Where(p => p.Field<string>(arr[0]) != "");
            //    }
            //    else
            //        x = x.Where(p => p.Field<string>(arr[0]) != "");
            //}
两个查询需要实现,又不能直接写在Linq语句里面,因为我需要判断是否用到这个查询[/quote] 搜 linq 查询表达式目录树 http://developer.51cto.com/art/200909/151787.htm

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧