5

わかりました、次の作業を行うことができました

public IQueryable getTicketInformation(int ticketID)
{
    var ticketDetails = from tickets in _context.tickets
        join file in _context.file_objects on tickets.ticket_id equals file.source_id
        where tickets.ticket_id == ticketID
        select new { tickets.ticket_id, tickets.title, tickets.care_of_email, file.filename };

    return ticketDetails.AsQueryable();
}

先に進み、プリミティブ ticket_id、title、care_of_email、および filename を含む独自のクラス (myObject) を作成しました。私のlinqステートメントで返すアイテムはどれですか。

私は自分の声明を次のように修正しました

public IQueryable<myObject> getTicketInformation(int ticketID)
{
    var ticketDetails = from tickets in _context.tickets
        join file in _context.file_objects on tickets.ticket_id equals file.source_id
        where tickets.ticket_id == ticketID
        select new { tickets.ticket_id, tickets.title, tickets.care_of_email, file.filename };

    return ticketDetails.AsQueryable()<myObject>;
}

これにより、ジェネリックでタイプセーフになると考えていますが、「メソッドグループ 'AsQueryable' を非デリゲート型 'System.Linq.IQueryable' に変換できません。メソッドを呼び出すつもりでしたか?」というエラーが表示されます。

私がやろうとしていることは可能ですか?

myObject クラスは IEnumerable または IQueryable を実装する必要がありますか?

または、linq の結果セットからオブジェクト MyObject を構築し、関数からオブジェクト MyObject を返すのが最善ですか?

public myObject getTicketInformation(int ticketID) 
{

    ....linq statement....
    myObject o = null;

    foreach (obj in linqstatemt)
    {
        o = new myObject();
        o.ticket_id = obj.ticket_id
        .......
    }
    return o;
}
4

4 に答える 4

14

もしかして:

select new MyObject { TicketId = tickets.ticket_id,
     Title = tickets.title, ...};

(名前を少し微調整して、C#の慣用性を高めたことに注意してください)

MyObjectこれは、新しい(レコードごとに)を作成し、ソース データからプロパティを割り当てる "オブジェクト初期化子" です。あなたが持っていたのは、同じではない「匿名型」の初期化子でした。デフォルト以外のコンストラクターがある場合は、次のようなものも使用できることに注意してください。

select new MyObject(tickets.ticket_id, tickets.title);

指定されたコンストラクターを使用し、ソース データから提供された値を渡します。

これは次のようになりIQueryable<MyObject>ます。電話する必要はありません.AsQueryable()IQueryable<MyObject>関数が untyped よりも typed form ()を返す方がよいことに注意してくださいIQueryable

于 2009-01-20T11:06:41.113 に答える
8

この行は構文的に正しくありません:

return ticketDetails.AsQueryable()<myObject>;

そして読むべき

return ticketDetails.AsQueryable<myObject>();

また、 を使用して匿名オブジェクトを作成していますが、インスタンスselect new {を作成したいと考えています。myObject正しい実装は次のようになります。

public IQueryable<myObject> getTicketInformation(int ticketID)
{

    return from tickets in _context.tickets
        join file in _context.file_objects on tickets.ticket_id equals file.source_id
        where tickets.ticket_id == ticketID
        select new myObject() { 
            ticket_id = tickets.ticket_id,
            title = tickets.title, 
            care_of_email = tickets.care_of_email, 
            filename = file.filename
        };

}

このnew SomeClass() { Property = value, ...構文はSomeClassインスタンスを作成し、プロパティを指定された値に設定します。または、クラスにコンストラクターを実装し、myObjectそれを linq ステートメントで呼び出すこともできますselect new myObject(...)

于 2009-01-20T11:22:09.587 に答える
2

myObjectマークが述べたように、クエリが実行されたときのインスタンスを構築していません。ただし、さらに、にキャストする必要はありません。明示的ににキャストしない限りIQueryable<T>、LINQ select ステートメントは を返します。IQueryable<T>IEnumerable<T>

また、返されるデータにアクセスしようとする前に、DataContext が破棄されていないことにも注意してください。しかし、コンテキストがメソッドで構築されていないことに気付きました。DataContext を長時間維持しないように注意してください。これは作業単位オブジェクトであり、長期間開いたままにすることを意図したものではありません。

于 2009-01-20T11:14:23.783 に答える
1

紳士、単一のテーブルのみを返す場合はすべて意味がありますが、返されるテーブルが2つ以上ある場合はどうなりますか?

RPDTDataContext smdt = new RPDTDataContext();
var projectedUsers = smdt.SM_Users.Join(
        smdt.SM_CTSGroups, u => u.CtsGroupID, c => c.id, 
        (u, c) => new { CTSGroup = c.Name, UserName = u.Name, u.EmpID, u.Email });
return projectedUsers;        
于 2012-03-18T20:11:05.033 に答える