LINQ Query Not Возвращает одно значение, которое должно быть там
В блоке кода у меня есть Foreach, который я использую для работы и подсчета определенных частей, которые могут или не могут существовать в базе данных. В основном для каждой части заказа я продолжаю подсчитывать группы продуктов, к которым они принадлежат, а затем подразделение, к которому принадлежат эти группы продуктов. Для этого я использую этот запрос LINQ:
foreach (var OrderDtl_yRow in ( from ThisOrderDtl in Db.OrderDtl
join ThisProdGrup in Db.ProdGrup on
ThisOrderDtl.ProdCode equals ThisProdGrup.ProdCode
where
ThisOrderDtl.Company == Session.CompanyID &&
ThisOrderDtl.OrderNum == 195792
select new
{
ProdCode = ThisOrderDtl.ProdCode,
Division = ThisProdGrup.Division_c,
OrderNum = ThisOrderDtl.OrderNum,
OrderLine = ThisOrderDtl.OrderLine
}))
{ ....counting things... }
В настоящее время у меня настроены окна сообщений для возврата значений во время процесса. Я получаю все, чтобы вернуться правильно, кроме деления, которое всегда отображается как пустое в MessageBoxes (так что я бы предположил NULL). Так что мои счетчики деления не увеличиваются.
Если я вынесу это в LINQPad, я не уверен, как вернуть результаты foreach, но я попробовал это с
if(OrderDtl_yRow.Division != null && OrderDtl_yRow.Division != "")
{i++;}
i.Dump();
и получил 5 (было 5 рядов, которые я ожидал, так что я, по крайней мере, потянул что-то наше). Затем я преобразовал его в более простой оператор FirstOrDefault, чтобы проверить одно значение, например
var OrderDtl_yRow = ( from ThisOrderDtl in OrderDtl
join ThisProdGrup in ProdGrup on
ThisOrderDtl.ProdCode equals ThisProdGrup.ProdCode
where
ThisOrderDtl.OrderNum == 195792 &&
ThisOrderDtl.OrderLine == 1
select new
{
ProdCode = ThisOrderDtl.ProdCode,
Division = ThisProdGrup.Division_c,
OrderNum = ThisOrderDtl.OrderNum,
OrderLine = ThisOrderDtl.OrderLine
}).FirstOrDefault();
Затем, если я выполняю OrderDtl_yRow.Dump(), я получаю свой результат и, конечно же, деление проходит. Так что все признаки указывают на то, что все в порядке, но я не могу привести значение, которое мне действительно нужно, чтобы оно появилось. Мысли? Спасибо!
PS Для тех, кто знаком с Epicor ERP Division, это поле UD, поэтому оно технически относится к таблице ProdGrup_UD, но в Epicor оно признало, что в качестве таблицы ProdGrup просто отлично, это единственный SQL, который заставляет вас присоединять _UD к родительской таблице. Я все равно пытался присоединиться к нему ради забавы, и мне это не понравилось, потому что он знал, что колонна уже была там. Так что должно быть хорошо.
ОБНОВЛЕНИЕ: Rookie Move не загружал данные Division в среду тестирования, поэтому ничего не было, затем проверил данные Live, где они были, и почесал голову, почему они не совпадают. Но я кое-что узнал о LinqPad и Linq, так что это не было бесполезным упражнением.
1 ответ
Вам нужно еще поиграть в Linqpad, чтобы увидеть, что происходит, установить язык для программы C#, нажать F4 и добавить ссылки на Server\Bin\Epicor.System.dll и Server\Assemblies\Erp.Data.910100.dll и указать app.copnfig в ваш файл Server\web.config. В главном блоке создайте себе контекст Db с var Db = new Erp.ErpContext();
Linqpad может отображать сложные структуры данных, поэтому вам не нужно было выполнять FirstOrDefault в последнем примере. например:
void Main()
{
var Db = new Erp.ErpContext();
var sessionCompany = "EPIC06";
var x = (from hed in Db.OrderHed
join dtl in Db.OrderDtl
on new { hed.Company, hed.OrderNum }
equals new { dtl.Company, dtl.OrderNum }
into dtlList
where
hed.Company == sessionCompany
select new { hed, dtlList })
.Dump();
}
Также обратите внимание, что в SQL dbo.ProdGrup
это автоматически сгенерированное представление, которое объединяет таблицы Erp.ProdGrup
а также Erp.ProdGrup_UD
для тебя.