0

我有这种类型的功能。现在我不知道如何调用它来从字段中获取数据。

public static IEnumerable GetMaterialSearch(int reqNo)
    {
        DataClassesCRMDataContext dbContext = new DataClassesCRMDataContext();
        try
        {
            var res = from tbl1 in dbContext.MaterialApplicants
                      join tbl2 in dbContext.MaterialRequests on tbl1.ApplicantID equals tbl2.Applicant
                      where tbl2.RCD_ID == reqNo
                      select new
                      {
                          Crusher = tbl2.Crusher,
                          ApplicantID = tbl2.Applicant,
                          Comments = tbl2.Comments,
                          ReqDate = tbl2.ReqDate,
                          Operator = tbl2.Operator,
                          Title = tbl1.Title,
                          Applicant = tbl1.Applicant,
                          Address = tbl1.Address,
                          Nationality = tbl1.Nationality,
                          HouseNo = tbl1.HouseNo,
                          MobileNo = tbl1.MobileNo,
                      };

            if (res.Count() > 0)
            {
                return res.ToList();  
            }
            return null;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
            return null;
        }
        finally
        {
            dbContext.Connection.Close();
        }
    }
4

2 回答 2

5

AnIEnumerable是一个通常用于迭代的序列:

var result = GetMaterialSearch(42);
if (result != null)
    foreach (var entry in result)
        DoSomething(entry);

编辑:正如上面所指出的,您的代码的问题是您在IEnumerable结果中返回了一个匿名类型。匿名类型不打算跨越方法边界。来自匿名类型(C# 编程指南)

您不能将字段、属性、事件或方法的返回类型声明为具有匿名类型。[...] 要将匿名类型或包含匿名类型的集合作为参数传递给方法,您可以将参数声明为类型对象。然而,这样做违背了强类型的目的。如果您必须存储查询结果或将它们传递到方法边界之外,请考虑使用普通的命名结构或类而不是匿名类型。

如果您绝对不想创建命名类,则可以使用反射来访问您的字段,例如通过dynamicC# 4 中引入的关键字:

var result = GetMaterialSearch(42);
if (result != null)
    foreach (dynamic entry in result)
        Console.WriteLine(entry.ID);
于 2013-08-31T12:04:40.313 回答
2

您的方法返回非泛型IEnumerable,这就是问题所在。您应该将其更改为 generic IEnumerable<T>,但这需要创建另一个类:

class MaterialItem
{
    public string Crusher { get; set; }
    public int ApplicantID { get; set; }
    // (...)
}

然后更改您的方法签名:

public static IEnumerable<MaterialItem> GetMaterialSearch(int reqNo)

并将您的查询更改为返回MaterialItems 而不是匿名类型对象:

        var res = from tbl1 in dbContext.MaterialApplicants
                  join tbl2 in dbContext.MaterialRequests on tbl1.ApplicantID equals tbl2.Applicant
                  where tbl2.RCD_ID == reqNo
                  select new MaterialItem
                  {
                      Crusher = tbl2.Crusher,
                      ApplicantID = tbl2.Applicant,
                      Comments = tbl2.Comments,
                      ReqDate = tbl2.ReqDate,
                      Operator = tbl2.Operator,
                      Title = tbl1.Title,
                      Applicant = tbl1.Applicant,
                      Address = tbl1.Address,
                      Nationality = tbl1.Nationality,
                      HouseNo = tbl1.HouseNo,
                      MobileNo = tbl1.MobileNo,
                  };

但这不是我要做的唯一改变。稍后调用Count()ToList()导致不必要的数据库调用。

我会去:

var results = res.ToList();
if(results.Any())
    return results;
return null;
于 2013-08-31T12:05:25.880 回答