LinQ没有返回datarow错误

时间:2014-01-20 08:46:36

标签: c# linq

在下面的代码中, Hours 与UI中的选定值一起传递,如下所示

Hours = "10.1, 11.2";

如果UI中没有值,则这些值将包含如下。

Hours = "";

下面的代码是将它们放在一起。从数据库中获取值。如果值为“”,则会出错。

q.CopyToDataTable()处的错误源不包含DataRows。

public void Populate_Gridview(string Hours)
{

string[] selectedHours = Hours.Split(',');

var q = from a in dt.AsEnumerable()
    where selectedHours.Contains(a.Field<double?>("Hours").ToString()) 
    select a;

GridView1.DataSource = q.CopyToDataTable();
GridView1.DataBind();
}

如果我有Double数组,如果输入没有任何值,即“”,我就不能将它们搞砸。我收到错误输入字符串的格式不正确。

Double[] selectedHours = Array.ConvertAll(All.Split(','), Double.Parse);

请指导我如何解决此问题。

3 个答案:

答案 0 :(得分:0)

第一个问题是CopyToDataTable仅在源中包含一些行时才有效。否则,它无法确定要包含在表中的列。一种可能的解决方案是使用正确的列创建一个空目标表,并将行复制到该表:

var destTable = dt.Copy();
destTable.Rows.Clear();
q.CopyToDataTable(destTable, LoadOption.OverwriteChanges);
GridView1.DataSource = destTable;
GridView1.DataBind();

另一个问题是,当调用空字符串时,默认情况下Split会返回一个空字符串的数组,因此当您调用Double.Parse时会出错。为避免这种情况,请使用StringSplitOptions.RemoveEmptyEntries

string[] splitted = All.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Double[] selectedHours = Array.ConvertAll(splitted, Double.Parse);

答案 1 :(得分:0)

首先,我会改进你从字符串中获取双精度的方式,因为你的方式容易出错且效率低下。你可以尝试这种方法:

double[] selectedHours = hours.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries)
    .Select(str => {
        str = str.Trim();
        double hour;
        bool isDouble = double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out hour);
        return new { str, isDouble, hour };
    })
    .Where(h => h.isDouble)
    .Select(h => h.hour)
    .ToArray();

var q = from row in dt.AsEnumerable()
        join hour in selectedHours
        on row.Field<double?>("Hours") equals hour 
        select row;
var dataSource = dt.Clone(); // empty
if (q.Any())
    dataSource = q.CopyToDataTable();

答案 2 :(得分:0)

试试这个

var q = from a in dt.AsEnumerable()
    where (selectedHours.Contains(a.Field<double?>("Hours").ToString()) 
    || selectedHours.Length==0)
    select a;