Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq:在datatable列中选择值_C#_Linq_Datatable - Fatal编程技术网

C# Linq:在datatable列中选择值

C# Linq:在datatable列中选择值,c#,linq,datatable,C#,Linq,Datatable,如何使用LINQ C为数据表中的特定行选择特定列中的值。等效的SQL是: select NAME from TABLE where ID = 0 提前谢谢 var name = from r in MyTable where r.ID == 0 select r.Name; 如果行是唯一的,则您甚至可以执行以下操作: var row = DataContext.MyTable.SingleOrDefault(r => r.ID == 0)

如何使用LINQ C为数据表中的特定行选择特定列中的值。等效的SQL是:

select NAME from TABLE where ID = 0
提前谢谢

var name = from r in MyTable
            where r.ID == 0
            select r.Name;
如果行是唯一的,则您甚至可以执行以下操作:

var row = DataContext.MyTable.SingleOrDefault(r => r.ID == 0);
var name = row != null ? row.Name : String.Empty;
假设您有一个了解行的DataTable,否则需要使用行索引:

where row[rowNumber] == 0

在本例中,如果要将行数据传递给另一个方法,您还需要使用select将行数据放入匿名类或预处理类中

我注意到其他人已经给出了非lambda语法,因此为了完成此操作,我将使用lambda语法等效:

根据詹姆斯的帖子,非lambda:

var name = from i in DataContext.MyTable
           where i.ID == 0
           select i.Name
等效lambda语法:

var name = DataContext.MyTable.Where(i => i.ID == 0)
                              .Select(i => new { Name = i.Name });

实际上并没有太大的实际差异,只是您喜欢的个人意见。

谢谢您的回答。我不明白您的答案中MyTable是什么类型的对象,下面的代码给了我如下所示的错误

DataTable dt = ds.Tables[0];
var name = from r in dt
           where r.ID == 0
           select r.Name;
找不到源类型的查询模式的实现 “System.Data.DataTable.”哪里找不到

所以我继续在谷歌上搜索,找到了一些有用的东西:

var rowColl = ds.Tables[0].AsEnumerable();
string name = (from r in rowColl
              where r.Field<int>("ID") == 0
              select r.Field<string>("NAME")).First<string>();

您认为如何?

使用linq并将数据表设置为可枚举,然后从数据表字段中选择与您要查找的内容匹配的字段

var name = from DataRow dr in tblClassCode.Rows where (long)dr["ID"] == Convert.ToInt32(i) select (int)dr["Name"]).FirstOrDefault().ToString() 
范例

我想从currency表(其中currency为本地货币)中获取货币Id和货币名称,并将货币Id和名称分配给表单上的文本框:

DataTable dt = curData.loadCurrency();
            var curId = from c in dt.AsEnumerable()
                        where c.Field<bool>("LocalCurrency") == true
                        select c.Field<int>("CURID");

            foreach (int cid in curId)
            {
                txtCURID.Text = cid.ToString();
            }
            var curName = from c in dt.AsEnumerable()
                          where c.Field<bool>("LocalCurrency") == true
                          select c.Field<string>("CurName");
            foreach (string cName in curName)
            {
                txtCurrency.Text = cName.ToString();
            }

如果返回值为字符串,并且需要按Id搜索,则可以使用:

string name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name")).ToString();
或使用通用变量:

var name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name"));

值得注意的是,调用SingleOrDefault调用实际上会选择所有按字面翻译成SQL的列,因为它返回的是MyTable对象,而不是IQueryable。取决于表中其他哪些内容可能会对性能产生影响,而select方法不会。在一个典型的表上,可读性可以说是值得的,因为性能差异很小,但因为问题是关于等效SQL的,所以我认为这是值得澄清的。当您希望从集合中检索唯一项时,使用SingleOrDefault最合适。如果你想使用“.AsEnumerable”,一定要添加dll“System.Data.DataSetExtensions”和using语句!修改了上面的注释:如果要使用“.AsEnumerable”,请确保添加dll“System.Data.DataSetExtensions”!不要为它使用语句!只需使用System.Data并引用.dll即可实现此功能。请注意,AsEnumerable将切换查询的上下文,以便在内存中而不是在DB端执行where/select。我认为您的lambda答案比标记的答案正确。SingleOrDefault将获取该行的所有列这不是OP请求的,OP只请求一列。Where和Select组合只获取所需的列,而不获取所有列。如果我错了,请纠正我。是的,你是对的。当然,您仍然可以在末尾执行.SingleOrDefault,例如:string name=DataContext.MyTable.Wherei=>i.ID==0.Selecti=>i.name.SingleOrDefault;将只向后查询1列。SingleOrDefault本身并没有什么可获取的,您只需要为它链接查询。话虽如此,除非其他列中有一些非常大的数据,否则性能开销通常可以忽略不计;对于mbaddeveloper:如果您只是想从一行中获取一个字段,那么关于first的注释是非常重要的。真是太棒了!
var name = datatable.AsEnumerable().Where(row => Convert.ToInt32(row["Id"]) == Id).Select(row => row.Field<string>("name"));