如何从2数据表中访问值作为C#中的tabel1.tabel2.columnname

状态
不接受进一步答复。

帕沙

知名会员
已加入
2020年4月29日
留言内容
64
编程经验
1-3
我有一个测试数据模型和一本有多张纸的excel书!所有工作表都具有相同的唯一键"Test1"我有一个函数可以从具有该键名的所有工作表中获取所有数据"Test1"

现在加入后-我得到一个包含所有列名和值的表,但是现在我想以Taable1.someobject(table).columnName的方式访问某些列

测试数据表: TestData.xlsx

我试过的

码:

<pre>命名空间AutoFramework.Model.Excel
{
公共类AccessExcelData
{
public static 串 TestDataFileConnection()
{
串 Filename = "D:\\ GIT-TA \\ src \\ Automation \\ Framework \\ ExcelData \\ TestData.xlsx";
串 connectionString = 串.Format("Dsn = Excel文件; READONLY = true; DBQ = {0};", Filename);
System.Data.Odbc.OdbcCommand odbcCmd =新的System.Data.Odbc.OdbcCommand("",新的System.Data.Odbc.OdbcConnection(connectionString));
返回connectionString;
}
公共静态IList<TestDataModel>GetAllTestData(字符串键名)
{
DataSet ds = new DataSet();
DataNamesMapper<TestDataModel>映射器=新的DataNamesMapper<TestDataModel>();
DataTable dataTableALL =新的DataTable();
清单<TestDataModel> testData = new 清单<TestDataModel>();
使用(var connection = new
OdbcConnection(TestDataFileConnection())
{
connection.Open();
OdbcCommand cmd =新的OdbcCommand();
cmd.Connection =连接;

System.Data.DataTable dtSheet = null;
dtSheet = connection.GetSchema(OdbcMetaDataCollectionNames.Tables,null);
foreach(dtSheet.Rows中的DataRow行)
{
串 sheetName = row["TABLE_NAME"].ToString();

如果(!sheetName.EndsWith("$"))
继续;

//查询每个Excel工作表。
var query = 串.Format("从[{0}]中选择*,其中TestName ='{1}'",sheetName,keyName);
cmd.CommandText =查询;

DataTable dt = new DataTable();
dt.TableName = sheetName;

OdbcDataAdapter da =新的OdbcDataAdapter(cmd);
da.Fill(dt);
ds.Tables.Add(dt);
}
cmd = null;
connection.Close();
}
DataTable数据= JoinExcelDatatoOneRow(ds);
testData = mapper.Map(data).ToList();
返回testData.ToList();
}

公共静态数据表JoinExcelDatatoOneRow(DataSet ds)
{
DataTable flatTable = null;
串 ID = "TestName";

为(int i = 0; i<ds.Tables.Count;我++)
{
数据表dt = ds.Tables;
如果(i == 0)
{
flatTable = dt.AsEnumerable()。CopyToDataTable();
}
其他
{
资料栏[] columns = dt.Columns.Cast<DataColumn>().ToArray();
foreach(列中的DataColumn col)
{
如果(col.ColumnName!= ID)
{
flatTable.Columns.Add(col.ColumnName,col.DataType);
}
}
var joins = from flatTable.AsEnumerable()中的t1
在dt.AsEnumerable()中加入t2
在t1.Field<string>(ID) equals t2.Field<string>(ID)
选择新的{t1 = t1,t2 = t2};
foreach(var加入联接)
{
foreach(列中的字符串列。<DataColumn>().Select(x => x.ColumnName))
{
如果(列!= ID)
{
join.t1 [column] = join.t2 [column];
}
}
}
}

}
串[] filteredColumns = { "payLater", "portal", "delivery" };
int [] filteredIndexes = filteredColumns.Select(x =>flatTable.Columns.Cast<DataColumn>().Where(y =>x == y.ColumnName).First()。Ordinal).ToArray();

数据表filterTable =新的DataTable();
foreach(filteredIndexes中的int索引)
{
filteredTable.Columns.Add(flatTable.Columns [index] .ColumnName,flatTable.Columns [index] .DataType);
}
foreach(flatTable.AsEnumerable()中的DataRow行)
{
filteredTable.Rows.Add(filteredIndexes.Select(y => row[y]).ToArray());
};

filteredTable.AsEnumerable()。Select((x,i)=> flatTable.Rows[7]);
DataRow row1 = filterTable.AsEnumerable()。Where(x => x.Field<string>("portal") == "abc").First();

返回flatTable;
}
}
}

测试数据模型


命名空间AutoFramework.Model.Excel
{
public partial class 测试数据模型
{

public 测试数据模型() {


}


[DataNames("TestName")]
public 串 测试名 { get; set; }



[DataNames("productId")]
public int productId {get;组; }

[DataNames("orderId")]
public int orderId {get;组; }


[DataNames("designMethod")]
公共DesignMethod设计方法{get;组; }

[DataNames("signedIn")]
public bool 登录 {get;组; }

[DataNames("increaseBasketQty")]
公共布尔增加值BasketQty {get;组; }

[DataNames("signedInCMS")]
public bool signatureInCMS {get;组; }

[DataNames("editable")]
公共布尔可编辑{组; }

// [DataNames("paymentOptions")]
// public PaymentOptions paymentOption {get;组; }

[DataNames("checkInVoice")]
公共布尔checkInVoice {get;组; }

[DataNames("navigateToDesign")]
公共布尔navigationToDesign {get;组; }

[DataNames("checkOrderAuthorsie")]
公共布尔checkOrderAuthorsie {get;组; }

[DataNames("checkSplitOrder")]
公共布尔checkSplitOrder {get;组; }

[DataNames("SiteId")]
public 串 SiteId { get; set; }

[DataNames("SiteUrl")]
public 串 SiteUrl { get; set; }

[DataNames("CultureCode")]
public 串 文化守则 { get; set; }

[DataNames("SiteGroupId")]
public 串 SiteGroupId { get; set; }

[DataNames("NickName")]
public 串 昵称 { get; set; }

[DataNames("byCard")]
public 串 卡 { get; set; }

[DataNames("payLater")]
public 串 以后支付 { get; set; }

[DataNames("sliceIt")]
public 串 sliceIt { get; set; }

[DataNames("portal")]
public PaymentPortal 门户网站 { get; set; }

[DataNames("delivery")]
public static DeliveryMethod 交货{get;set;}


}

}
存取资料

var param1 = AccessExcelData.GetAllTestData("Test1");
var orderId = param [1] .orderId;
现在我要访问说的列值"payLater" as

param1.PaymentOptions.payLater
PaymentOptions函数在哪里

公共类PaymentOptions
{
public PaymentPortal 门户网站;
public DeliveryMethod交付= DeliveryMethod.Billing;

公共PaymentOptions()
{
}
public PaymentOptions(网站)
{

}
}

公共类KlarnaOptions:PaymentOptions
{
//默认-不使用默认的信用卡付款
public bool 卡 = false;
public bool 以后支付 = false;
public bool sliceIt = false;
公共KlarnaOptions()
{
门户网站 = PaymentPortal.Klarna;
}
}
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,921
地点
英国
编程经验
10+
在您之后,我们需要清理多少次?

在将代码发布到论坛时,请使用代码标签,我之前曾问过您不要在没有将所有代码都包含在代码标签内的情况下在论坛上发布代码。

用适当的代码块中包含的代码重新发布您的问题,否则您将发现继续违规而忽略此请求将导致您的主题被关闭。

谢谢
闭幕。
 
状态
不接受进一步答复。
最佳 底部