Использование Take () с анонимным типом (поставщик DB2) - PullRequest
2 голосов
/ 27 марта 2012

Я использую поставщика DB2 для обращения к базе данных на сервере AiX. Вот оператор LINQ, который я использую для возврата анонимного типа.

var docs = (from a in WIP
            where (!dtFrom.HasValue && !dtTo.HasValue) || (a.QBE_DT.Value >= dtFrom.Value && a.QBE_DT.Value <= dtTo.Value) && a.STATUSCODE != "X" && a.KEY1 != "CABS" && a.KEY1 != "BPI"
            group a by new
            {
                a.BATCH_ID,
                a.POLICY_NUM,
                a.QBE_DT
            } into grp
            select new
            {
                BatchId = grp.Key.BATCH_ID.Trim(),
                BatchGroup = grp
            }).ToList();

Возврат этого вызывает провайдер для тайм-аута, и процесс был отменен из-за ошибки прерывания. Я думаю, что если я "возьму" часть набора записей, эта проблема исчезнет. У меня проблема в том, что я не могу просто добавить Take(100) перед ToList(), потому что он выдает:

SQL0418N A statement contains a use of an untyped parameter marker, the DEFAULT keyword, or a null value that is not valid. SQLSTATE=42610

Хотелось бы увидеть сгенерированный SQL, чтобы убедиться, что это правильный синтаксис, но я не знаю, как это сделать в этой ситуации. Есть ли элегантный способ получить первые X-элементы из приведенного выше оператора LINQ?

Ответы [ 3 ]

1 голос
/ 10 апреля 2012

Обходным путем для этого было сделать группировку и фильтрацию в памяти и получить больший объем данных из источника

1 голос
/ 27 марта 2012

Если проблема действительно связана с использованием анонимных типов, вы можете просто создать именованный тип.

public class BatchKey
{
    public int BatchId {get;set;}
    ...
}
...
        group a by new BatchKey
        {
            BatchId = a.BATCH_ID,
            ...

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

Возможно, вы захотите добавить OrderBy перед вашим Take, поскольку некоторые поставщики требуют, чтобы набор данных был упорядочен по порядку.выполнить Take.Возможно, вы также захотите оценить, что вы можете сделать за пределами вашего запроса:

IQueryable<WIP> wips = WIP.Where(a => a.STATUSCODE != "X" && a.KEY1 != "CABS" && a.KEY1 != "BPI");
if (dtFrom.HasValue) {
   wips = docs.Where(a => a.QBE_DT.Value >= dtFrom.Value);
}
if (dtTo.HasValue) {
   wips = docs.Where(a => a.QBE_DT.Value <= dtTo.Value);
}
var docs = from a in wips
           group a by ...

Я полагаю, что вы сможете настроить LINQPad для использования вашего поставщика DB2 и увидеть производимые операторы SQL.(Но эта ошибка выглядит так, как будто она произошла до того, как сгенерирован оператор SQL).

0 голосов
/ 27 марта 2012

Вероятно, эта часть и другие ссылки на объекты отсутствуют в запросе.

(!dtFrom.HasValue && !dtTo.HasValue)

Возьмите это и посмотрите, работает ли оно.

...