0

まず、以下に示すように、コントローラーに linq クエリの結果を格納する変数があります。

var test= from m in db.testTable
          join n in db.testTable2
          on m.ID equals n.ID into tabA
          from a in tabA
          join o in db.testTable3
          on m.UserID equals o.ID
          select new { .................};
if (test.Count() > 0)
{
    foreach (var k in test)
    {
        ViewData["dropDown_xxx"] = test.Select(j => new { Value = j.ID, Text = j.Description})
                                   .AsEnumerable()
                                   .Select(j => new SelectListItem // Work with in-memory objects using LINQ to Objects instead of LINQ to Entities
                            {
                                Value = j.Value.ToString(),
                                Text = j.Text
                            }).ToList();
                    }  

上記は完全に機能し、ドロップダウン リストと ViewData を生成できました。
以下に示すように、このコントローラーを配置する代わりに、このlinQクエリを別のクラスに移動しようとしています。

public class testClass{
    public IQueryable<dynamic> TestMethod(){
        return from m in db.testTable
        join n in db.testTable2
        on m.ID equals n.ID into tabA
        from a in tabA
        join o in db.testTable3
        on m.UserID equals o.ID
        select new { .................};
    }
}     

そして今、私の前のコントローラーでそれを呼び出します:

       var test= new testClass().TestMethod();
if (test.Count() > 0)
{
    foreach (var k in test)
    {
        ViewData["dropDown_xxx"] = test.Select(j => new { Value = **j.ID**, Text = **j.Description**})
                                   .AsEnumerable()
                                   .Select(j => new SelectListItem // Work with in-memory objects using LINQ to Objects instead of LINQ to Entities
                            {
                                Value = j.Value.ToString(),
                                Text = j.Text
                            }).ToList();
                    }  

コードのどこが間違っているか分かりますか? J.IDとJ.Descriptionで、式ツリーに動的操作が含まれていない可能性があると不平を言うようになりました

4

1 に答える 1

0

ここでは、動的タイプは のスコープ内のみTestMethodです。新しいクラスを作成し、そのクラスを呼び出し元に返す方がよいでしょう。

public class testClass{
    public IQueryable<MyClass> TestMethod(){
        return from m in db.testTable
        join n in db.testTable2
        on m.ID equals n.ID into tabA
        from a in tabA
        join o in db.testTable3
        on m.UserID equals o.ID
        select new MyClass{ .................};
    }
}    

匿名型を返す必要がある場合は、これを確認してください

メソッドから匿名型を返すことはできませんか? 本当に?

于 2013-09-04T07:22:19.360 に答える