首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Datatables、exceed、join

Datatables、exceed、join
EN

Stack Overflow用户
提问于 2012-04-13 22:05:07
回答 2查看 134关注 0票数 2

我有一个名为sourceTable的数据表,其中包含列source_Idtitleprogramme_Id。第二个数据表是具有列credit_Idprogramme_Idcredits。所有列的类型都是Int,而不是列标题。

数据表credits中的列programme_Id是来自数据表sourceTable的外键

我想要实现的是用来自数据表credits的列credit_Id超过表sourceTable

我写了一个可以工作的代码,但速度很慢,有没有更好的方法!,如果没有我要查找的项,FirstOrDefault会放0,也许在这种情况下,返回空值比返回0更好

代码语言:javascript
复制
sourceTable.columns.Add("credits_Id");
var rowColl = credits.AsEnumerable();
foreach (DataRow row in sourceTable.Rows)
{
    var credits_Id =
        (from r in rowColl
         where r.Field<int>("programme_Id") == Convert.ToInt32(row["programme_Id"].ToString())
         select r.Field<int>("credits_Id")).FirstOrDefault<int>();

    row["credits_Id"] = credits_Id;
}
EN

回答 2

Stack Overflow用户

发布于 2012-04-13 22:28:09

它的运行速度很慢,因为您要为源表中的每一行迭代credits表中的所有行。您可以使用以下linq查询来联接这两个表。

代码语言:javascript
复制
(from sourceRow in sourceTable.Rows.OfType<DataRow>()
join creditRow in credits.Rows.OfType<DataRow>()
   on sourceRow.Field<int>("programme_Id") equals creditRow.Field<int>("programme_Id")
select new {sourceRow, creditRow})
   .ForEach(o => o.sourceRow["credits_id"] = o.creditRow["sourceRow"]);
票数 0
EN

Stack Overflow用户

发布于 2012-04-17 05:09:54

以防google带人来这里:这是我现在提出的问题的解决方案:)

代码语言:javascript
复制
var q = from c in sourceTable.AsEnumerable()
                    join o in credits.AsEnumerable() on c.Field<int>("programme_Id") equals o.Field<int>("programme_Id") into outer
                    from o in outer.DefaultIfEmpty()
                    select new
                    {

                        title=c.Field<string>("title"),

                        credits_Id = (o==null)?-1:o.Field<int>("credits_Id")
                    };
            var qToList = q.ToList();

现在我们可以将此列表转换为Datatable:

代码语言:javascript
复制
public static DataTable ListToDataTable<T>(List<T> list)
    {
        DataTable dtToConvert = new DataTable();
        try
        {

        foreach (PropertyInfo info in typeof(T).GetProperties())
        {
            dtToConvert.Columns.Add(new DataColumn(info.Name, info.PropertyType));
        }
        foreach (T t in list)
        {
            DataRow row = dtToConvert.NewRow();
            foreach (PropertyInfo info in typeof(T).GetProperties())
            {
                row[info.Name] = info.GetValue(t, null);
            }
            dtToConvert.Rows.Add(row);
        }

        } catch(Exception ex)
            {


            }
        return dtToConvert;
    }

干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10142337

复制
相关文章

相似问题

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