2

var typeのさまざまなテーブルから値を取得しているので、それらを返したいと思います。関数の戻り型はどうあるべきか:-

  public void getlist()
    {
        try
        {
            using (ShowDataToClientDataContext c = new ShowDataToClientDataContext())
            {
               var recList = (from record in c.GetTable<T_RECORDSHOW>()
                              where record.RecordStatus.Equals(RecordStatus.Active)
                              select new
                              {
                                  Student = (from stu in c.T_STUDENTSHOWs
                                             where stu.Id.Equals(record.StudentId)
                                             select stu.Name).Single().ToString(),
                                  Trade = (from t in c.T_TRADESHOWs
                                           where t.Id.Equals(record.TradeId)
                                           select t.Name).Single().ToString(),
                                  SessionId = (from s in c.T_SESSIONSHOWs
                                               where s.Id.Equals(record.SessionId)
                                               select s.Name).Single().ToString(),
                                  Month = record.Month.ToString(),
                                  Attendance = record.Attendance.ToString(),

                              }).ToList();
               return recList;
            }

        }
        catch
        {

        }
    }

誰か私を助けるためにそこにいますか?

4

5 に答える 5

15

varそれ自体はタイプではありません。ローカル変数の型を推測するようにコンパイラに要求するだけです。

あなたの場合、型はList<T>匿名T型です。他のコードからリストの要素内のプロパティを使用できるようにする場合は、動的に (ick) 使用するか、匿名型を完全な名前付き型に変換する必要があります。匿名型は、実際には、オブジェクトが作成されたメソッドからのみ使用されるように設計されています。List<DenormalizedRecord>その後、 aまたは何でも返すことができます。

また、結合のみを使用すると、クエリがはるかに簡単になることにも注意してください。

 from record in c.GetTable<T_RECORDSHOW>()
 where record.RecordStatus.Equals(RecordStatus.Active)
 join student in c.T_STUDENTSHOWs on record.StudentId equals student.Id
 join trade in c.T_TRADESHOWs on record.TradeId equals trade.Id
 join session in c.T_SESSIONSHOWs on record.SessionId equals session.Id
 select new DenormalizedRecord {
     Student = student.Name,
     Trade = trade.Name,
     SessionId = session.Name, // Confusing property name, by the way
     Month = record.Month.ToString(), // Why the ToString()?
     Attendance = record.Attendance.ToString() // What the ToString()?
 }
于 2012-10-05T06:32:41.543 に答える
2

メソッドから匿名型を返せないというのは完全に真実ではありません。リフレクションでトリッキーなものを使用するという意味ではありません。インスタンス化の負担を呼び出し元に移すだけです。

IEnumerable<T> getlist<T>(Func<string, string, string, string, string, T> resultor)
{
    try
    {
        using (ShowDataToClientDataContext c = new ShowDataToClientDataContext())
        {
           var recList = (from record in c.GetTable<T_RECORDSHOW>()
                          where record.RecordStatus.Equals(RecordStatus.Active)
                          select resultor
                          (
                              (from stu in c.T_STUDENTSHOWs
                                         where stu.Id.Equals(record.StudentId)
                                         select stu.Name).Single().ToString(),
                              (from t in c.T_TRADESHOWs
                                       where t.Id.Equals(record.TradeId)
                                       select t.Name).Single().ToString(),
                              (from s in c.T_SESSIONSHOWs
                                           where s.Id.Equals(record.SessionId)
                                           select s.Name).Single().ToString(),
                              record.Month.ToString(),
                              record.Attendance.ToString()
                          )).ToList();
           return recList;
        }

    }
    catch
    {

    }
}

型推論は魔法のように機能するため、次のようにメソッドを呼び出すことができます。

var list = getlist((st, tr, sid, m, att) => new 
{ 
    Student = st,
    Trade = tr,
    SessionId = sid,
    Month = m,
    Attendance = att 
});

これらの結果を出力するためだけに DTO クラスを定義する必要はありません。

PS:クエリ自体はもっと良いかもしれませんが、私はあなたの質問の問題に取り組んでいます.

于 2012-10-05T08:58:42.260 に答える
0

問題を解決するために、いくつかの汎用パラメーターを使用できることに注意しました。

メソッドシグネチャを次のように変更します。

public List<TReturn> getlist<TReturn>() 

そして、に変更ToList<ClassName>()しますToList<TReturn>

これにより、メソッドは任意のタイプのリストを返すことができます(もちろん、モデルでサポートされています!)。

于 2012-10-05T07:01:09.897 に答える
0

メソッドから匿名型を返すことはできません(おそらく、いくつかの非常に技術的な回避策があります)。

おそらく、返してもらいたいプロパティを持つクラスを作成し、そのクラスのオブジェクトを返す必要があります。

于 2012-10-05T06:32:10.607 に答える
0

カスタム クラスを作成します。戻り型として使用する

select new CustomClass
{
    Propery1 = YourSelectedPropery1
    , Propery2 = YourSelectedPropery2
}
于 2012-10-05T06:32:34.133 に答える