Строка усечения Linq to sql, возвращаемая хранимой процедурой - PullRequest
1 голос
/ 25 июня 2009

Я задавал этот вопрос раньше. но я не смог получить никакого ответа. может быть, я не очень ясно. позвольте мне рассказать подробнее.

У меня есть SP, который возвращает длинную строку. вот код файла dbml

[Function(Name="dbo.spX")]
public ISingleResult<spXResult> spX([Parameter(DbType="VarChar(8000)")] string str)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), str);
    return ((ISingleResult<spXResult>)(result.ReturnValue));
}

а вот класс spXResult

public partial class spXResult
{
    private string _XML_F52E2B61_18A1_11d1_B105_00805F49916B;

    public spXResult()
    {  }

    [Column(Name="[XML_F52E2B61-18A1-11d1-B105-00805F49916B]", 
     Storage="_XML_F52E2B61_18A1_11d1_B105_00805F49916B", 
     DbType="NText", UpdateCheck=UpdateCheck.Never)]
    public string XML_F52E2B61_18A1_11d1_B105_00805F49916B
    {
        get
        {
            return this._XML_F52E2B61_18A1_11d1_B105_00805F49916B;
        }
        set
        {
            if ((this._XML_F52E2B61_18A1_11d1_B105_00805F49916B != value))
            {
                this._XML_F52E2B61_18A1_11d1_B105_00805F49916B = value;
            }
         }
     }
}

и вот мой код

ISingleResult<spXResult> result = ctx.spX("1234");

string returnStr = result.First().XML_F52E2B61_18A1_11d1_B105_00805F49916B;

все нормально, когда результат не длинная строка, но как только sp возвращает очень длинную строку, он усекает результат. я понятия не имею, почему .. может кто-нибудь, пожалуйста, помогите.

спасибо

Ответы [ 3 ]

1 голос
/ 24 июля 2013

LinqToSql разбивает результирующий набор XML на куски, поэтому вам нужно запустить цикл следующим образом:

ISingleResult<spXResult> result = ctx.spX("1234");
string xml = "";
foreach (var x in result)
    xml += x.XML_F52E2B61_18A1_11d1_B105_00805F49916B;

Или используя LINQ:

string xml = result.Aggregate("", (current, x) => current + x.XML_F52E2B61_18A1_11d1_B105_00805F49916B);
1 голос
/ 25 июня 2009

Единственное, что я могу заметить, - это здесь, в декларации, вы:

public ISingleResult<spXResult> spX([Parameter(DbType="VarChar(8000)")] string str)

(DbType = VARCHAR (8000)) - это ANSI (не Unicode), но затем в объявлении столбца вы используете NTEXT - прежде всего, это UNICODE (2 байта на символ) и почему NTEXT ?? Выше у вас есть VARCHAR?

[Column(Name="[XML_F52E2B61-18A1-11d1-B105-00805F49916B]", 
     Storage="_XML_F52E2B61_18A1_11d1_B105_00805F49916B", 
     DbType="NText", UpdateCheck=UpdateCheck.Never)]

Это кажется немного странным .......

Можете ли вы попробовать сделать то же самое в обоих местах? Например. VARCHAR (8000) в обоих случаях ??

Марк

0 голосов
/ 22 июля 2009

Просто измените свой sp с

SELECT ...
  FROM MyTable
  FOR XML AUTO

до

DECLARE @ResultXML xml

SET @ResultXML = 
 (SELECT ...
  FROM MyTable
  FOR XML AUTO)

SELECT @ResultXML as [MyXML]

и воссоздать метод linq

...