1

次のことができるようになりたいです。

私にはモデルがあり、その中にエンティティがあります。

このエンティティの構造は次のとおりです。

public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}   

私が今欲しいのは、IDに基づいてクライアント名を取得することです。したがって、これを行うストアドプロシージャを作成しました。

CREATE PROCEDURE [Client].[GetBasics]
@Id INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;


SELECT 
    Name
FROM Client.Client
INNER JOIN Client.Validity ON ClientId = Client.Id
WHERE
    Client.Id = @Id; 
 END

ここで VS に戻り、ストアド プロシージャを含めてデータベースからモデルを更新します。

次のステップは、このストアド プロシージャを関数インポートとしてクライアント エンティティにマップすることです。

これもうまくいきます。

1 つのクライアントの名前を読み込もうとすると、実行時にエラーが発生します...

「データ リーダーは、指定された 'CSTestModel.Client' と互換性がありません。タイプ 'Id' のメンバーには、データ リーダーに同じ名前の対応する列がありません。」

メッセージでOKです。これを修正する方法を知っています (結果セット ID、名前、説明として返されます)。

この質問の背後にある私の考えは次のとおりです。

完全なエンティティ自体ではなく、エンティティの一部をロードしたいだけです。ここでは、データベースとの間の通信全体にストアド プロシージャのみを使用するという制限があります。

私の問題に対する解決策はありますか (複雑な型の作成、結果セット自体に対する LINQ を除く)? はいの場合、誰かが私を正しい方向に向けることができますか?

どうもありがとう、

ディミ

4

1 に答える 1

1

POCOに投影するだけです:

var q = from c in Context.Clients
        select new NameOnlyPresentation
                   {
                       Id = c.Id,
                       Name = c.Name
                   };

... または単に名前:

public string ClientName(int id)
{
    return (from c in Context.Clients
            where c.Id == id
            select c.Name).FirstOrDefault();
}
于 2010-04-20T12:59:41.370 に答える