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,我确实从包含存储过程的数据库中更新了模型。

下一步是将此存储过程映射到客户端实体作为函数导入。

这也很好用。

现在尝试在运行时加载一个客户端的名称会导致错误...

“数据读取器与指定的‘CSTestModel.Client’不兼容。类型的成员‘Id’在数据读取器中没有对应的同名列。”

我对消息没意见。我知道如何解决这个问题(作为结果集 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 回答