繁体   English   中英

c# 如何通过 LINQ 查询数据表

[英]c# How to query Datatable by LINQ

我知道如何通过 LINQ 查询数据表,但代理名称出现在我无法查询的数据表列中。 看看数据是怎么来的。 附上屏幕截图。

在此处输入图像描述

请参阅美银美林或德意志银行,这些是作为一列出现的经纪人名称。

这种方式我一般通过LINQ查询数据表。

                ds.Tables[2].AsEnumerable().Where(x => x.Field<int>("EarningID") == earningsid
                    && x.Field<string>("EarningsType") == earningsType
                    && x.Field<string>("EarningsType") == earningsType
                    && x.Field<string>("DisplayInCSM") == DisplayInCSM
                    && x.Field<string>("Type") == Type
                    && x.Field<string>("Broker") == BrokerCode
                    && x.Field<string>("Period") == Period
                    );

现在告诉我如何在代理名称的 where 条件下再添加一个子句。

我怎么能在 where 子句中提到列名,例如&& x.Field<string>("Deutsche Bank")结果 LINQ 查询应该返回值说19738.5877

在我上面的 linq 查询中,我在 where 中提到了很少的条件,但我怎么能在 where 中提及德意志银行的列名,我应该得到值19738.5877

请分享正确的 LINQ 查询,我还可以在其他条件下提及列名。 谢谢

编辑

我尝试用这种方式查询列,但收到错误附加信息:无法将 DBNull.Value 转换为类型“System.Int32”。 请使用可为空的类型。

private string GetData<T>(DataTable table, DataTable dt, int earningsid, string earningsType, string DisplayInCSM,
    string Type, string BrokerCode, string Period, T value) where T : IComparable<T>
{
    string brokername = GetBrokerName(dt, BrokerCode);

    IEnumerable<DataRow> rows = table.Rows.OfType<DataRow>()
            .Where(r => r.Field<int>("EarningID") == earningsid
                && r.Field<string>("EarningsType") == earningsType
                && r.Field<string>("DisplayInCSM") == DisplayInCSM
                && r.Field<string>("Type") == Type
                && r.Field<string>("Broker") == BrokerCode
                && r.Field<string>("Period") == Period
                && r.Field<T>(brokername).CompareTo(value) >= 0);

    string rowValue =(rows.FirstOrDefault()[brokername]==DBNull.Value ? "" : rows.FirstOrDefault()[brokername].ToString());

    return rowValue;
}

编辑 1

------
            IEnumerable<DataRow> rows = table.Rows.OfType<DataRow>()
                    .Where(r => r.Field<int>("EarningID") == earningsid
                        && r.Field<string>("EarningsType") == earningsType
                        && r.Field<string>("DisplayInCSM") == DisplayInCSM
                        && r.Field<string>("Type") == Type
                        && r.Field<string>("Broker") == BrokerCode
                        && r.Field<string>("Period") == Period
                        /*&& r.Field<T>(brokername).CompareTo(value) >= 0*/
                        && r.Field<object>(brokername) != DBNull.Value);

对于上面的代码,我收到此错误无法将 DBNull.Value 转换为类型“System.Int32”。 请使用可为空的类型。

您不能将intSystem.DbNull进行比较,这就是异常告诉您的。 您的参数中唯一的intearningsid ,实际上您的屏幕截图显示了该列的 null 值。

很好, Field扩展方法还支持可空类型( r.Field<int?>("...") ):

IEnumerable<DataRow> rows = table.Rows.OfType<DataRow>()
    .Where(r => r.Field<int?>("EarningID") == earningsid
        && so on ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM