如何解决从Linq-to-SQL调用存储过程时,铸造无效
|| Linq-to-SQL业务层调用SQL存储过程并获取:Unable to cast object of type \'WhereSelectEnumerableIterator`2
[ERICustomersDataLayer.MergeCustomersResult,ERICustomersDataLayer.MergeCustomersResult]\'
to type \'System.Collections.Generic.List`1[System.String]\'.
存储过程:
ALTER PROCEDURE MergeCustomers @CurrentCustomerId UNIQUEIDENTIFIER,@MergedCustomerId UNIQUEIDENTIFIER
AS
BEGIN
DECLARE @Error VARCHAR(500);
IF NOT EXISTS (SELECT * FROM Customer WHERE Id = @CurrentCustomerId)
BEGIN
SET @Error = \'Current customer ID not in customer table \'
SELECT @Error [Error]
RETURN -1
END
IF NOT EXISTS (SELECT * FROM Customer WHERE Id = @MergedCustomerId)
BEGIN
SET @Error = \'Merged customer ID not in customer table \'
SELECT @Error [Error]
RETURN -1
END
END
Linq-to-SQL代码:
public List<string> Merge(Guid CurrentUserId,Guid MergedUserId)
{
var dc = new ERICustomersDataLayer.ERICustomersDataContext();
var rows = (
from e in dc.MergeCustomers(CurrentUserId,MergedUserId)
select e);
return (List<string>)rows;
}
在测试用例中,SP不返回任何内容,因此它应该与空查询相同。但是,即使它确实返回错误消息,我也会遇到同样的异常。
解决方法
就像driis所说的,linq不是返回列表,而是MergeCustomersResult的IEnumerable。因此,您不能只是将其转换为List或简单地执行.ToList()。您需要确保var \“ rows \”是字符串列表,然后才能将其返回为一个。尝试这样的事情:
public List<string> Merge(Guid CurrentUserId,Guid MergedUserId) {
var dc = new ERICustomersDataLayer.ERICustomersDataContext();
var rows = (from e in dc.MergeCustomers(CurrentUserId,MergedUserId)
select e.Error);
return rows.ToList();
}
我不确定如何设置MergeCustomerResult,但我猜它具有名为Error的属性,该属性映射到您在sp中返回的[Error]列。
,您的错误仅表示无法将结果转换为列表。这是有道理的,因为LINQ查询返回的不是List,而是一个IQueryable
(或IEnumerable
),其实现基于实际表达式和基础提供程序。
您可以轻松修复此错误。尝试使用ToList
扩展方法将其转换为列表:
return rows.ToList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。