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# プログラミング ガイド) :

フィールド、プロパティ、イベント、またはメソッドの戻り値の型を匿名型として宣言することはできません。[...] 匿名型、または匿名型を含むコレクションを引数としてメソッドに渡すには、パラメーターを型オブジェクトとして宣言できます。ただし、これを行うと、厳密な型指定の目的が無効になります。クエリ結果を格納するか、メソッド境界の外に渡す必要がある場合は、匿名型ではなく、通常の名前付き構造体またはクラスを使用することを検討してください。

名前付きクラスを絶対に作成したくない場合はdynamic、C# 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)

MaterialItemそして、匿名型オブジェクトの代わりに sを返すようにクエリを変更します。

        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()と、不要な DB 呼び出しが発生します。

私は一緒に行きます:

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