C# LINQ Join Error - c#

SELECT PART_TYPE.PART_TYPE_ID,
PART_TYPE.PART_TYPE_NAME,
PART_AVAILABILITY.DATE_REF,
PART_TYPE.VEHICLE_ID,
PART_AVAILABILITY.AVAIL_COUNT
FROM PART_AVAILABILITY
RIGHT JOIN PART_TYPE
ON PART_AVAILABILITY.PART_TYPE_ID = PART_TYPE.PART_TYPE_ID
AND PART_AVAILABILITY.VEHICLE_ID = PART_TYPE.VEHICLE_ID
where PART_TYPE.VEHICLE_ID = 366
PART_TYPE_ID and VEHICLE_ID are Primary Key in PART_TYPE table.
VEHICLE_ID is a Foreign Key from VEHICLE table.
DATE_REF, PART_TYPE_ID and VEHICLE_ID are Primary Key in PART_AVAILABILITY table.
VEHICLE_ID and PART_TYPE_ID are Foreign Key from PART_TYPE table.
Above query gave below output.
PART_TYPE_ID PART_TYPE_NAME DATE_REF VEHICLE_ID AVAIL_COUNT
5 A1 2013-06-20 00:00:00.000 366 1
6 B1 2013-06-20 00:00:00.000 366 2
7 C1 2013-06-20 00:00:00.000 366 1
8 D1 NULL 366 NULL
9 E1 NULL 366 NULL
16 F1 2013-06-20 00:00:00.000 366 1
This my linq query for above sql query.
var vehiclePartType = from pa in context.PART_AVAILABILITY
join pt in context.PART_TYPE
on pa.PART_TYPE_ID equals pt.PART_TYPE_ID into joined
from j in joined.DefaultIfEmpty()
where j.VEHICLE_ID == 366
select new
{
PART_TYPE = j,
PART_AVAILABILITY = pa
};
But linq query gave below output.
PART_TYPE_ID PART_TYPE_NAME DATE_REF VEHICLE_ID AVAIL_COUNT
5 A1 2013-06-20 00:00:00.000 366 1
6 B1 2013-06-20 00:00:00.000 366 2
7 C1 2013-06-20 00:00:00.000 366 1
16 F1 2013-06-20 00:00:00.000 366 1
NULL records are missing.
How can i solve this ?

Right Join in LINQ is done by reversing join statements so correct one would be this:
var vehiclePartType = from pt in context.PART_TYPE
join pa in context.PART_AVAILABILITY on pt.PART_TYPE_ID equals pa.PART_TYPE_ID into joined
from j in joined.DefaultIfEmpty()
where pt.VEHICLE_ID == 366
select new
{
PART_TYPE = pt,
PART_AVAILABILITY = j
};

I think You have to swap your tables. Actually what you are doing is left join . To convert into right just swap the tables Like::
{
var vehiclePartType = from
pt in context.PART_TYPE join pa in context.PART_AVAILABILITY
on pt.PART_TYPE_ID equals pa.PART_TYPE_ID into joined
from j in joined.DefaultIfEmpty()
where j.VEHICLE_ID == 366
select new
{
PART_TYPE = j,
PART_AVAILABILITY = pa
};
}

I am not too much familier with LINQ but in your SQL query you have
AND PART_AVAILABILITY.VEHICLE_ID = PART_TYPE.VEHICLE_ID
This is missing in your LINQ query.

Related

Dynamic Left join 2 datatable

I have 2 C# datatable:
Datatable A:
id
Name
Age
Height
01
Pauls
22
170
02
Sam
20
175
03
Mike
20
175
04
Jame
23
180
Datatable B:
id
Height
Age
01
175
23
02
190
21
The question here is how could I get this output by join 2 table A & B by id and get output datatable using Linq in C# OutputTable:
id
Name
Age
Height
01
Pauls
23(value in table B)
175 (value in table B)
02
Sam
21(value in table B)
190 (value in table B)
03
Mike
20
175
04
Jame
23
180
My code here:
var results = from ta in tableA.AsEnumerable()
join tb in tableB.AsEnumerable on ta["id"] equals tb["id"]
select new
{
ta["id"],
ta["Name"],
tb["Age"],
tb["Height"]
};
My output so far (not what I expected):
id
Name
Age
Height
01
Pauls
23(value in table B)
175 (value in table B)
02
Sam
21(value in table B)
190 (value in table B)
P/s: above table is just an example data, true data is bigger
INNER JOIN works as filter if record not found on the right side. You have to use LEFT JOIN here, which is implemented in LINQ as GroupJoin with SelectMany:
var results = from ta in tableA
join tb in tableB on ta.id equals tb.id into g
from tb in g.DefaultIfEmpty()
select new
{
ta.id,
ta.Name,
Age = tb != null ? tb.Age : ta.Age,
Height = tb != null ? tb.Height : ta.Height,
};
Could you try something like this:
var results = from ta in tableA
join tb in tableB on ta.id equals tb.id into gj
from subTableA in gj.DefaultIfEmpty()
select new
{
id = ta.id,
Name = ta.Name,
Age = (subTableA == null ? ta.Age : tb.Age + "(value in table B)"),
Height = (subTableA == null ? ta.Height : tb.Height + "(value in table B)")
};
Here is some page about left join using Entity Framework - https://learn.microsoft.com/en-us/dotnet/csharp/linq/perform-left-outer-joins
Idea is to introduce row 'from subTableA in gj.DefaultIfEmpty()' in order to get all rows from the join, even those which don't have matching value in second table.
If I understand the question correctly, you want to get back a DataTable from your LINQ query. However, LINQ returns an IEnumerable<T> or an IQueryable<T> if you're querying a database.
If you want a DataTable, you'll need some additional code. I suggest you refer to the top answer on this StackOverflow question, which provides a solution for converting an IEnumerable to a DataTable.

i am stuck at this query

how can I display same column twice in a table but with different data using sql?
I have 3 tables tbstu, tbexm, tbscr
tbstu = stucod int PK, stunam var(100)
tbexm = exmcod int PK, exmnam var(100)
tbscr = scrcod int PK, scrsub var(100), scrach int
scrstucod int FK (to table tbstu)
screxmcod int FK (to table tbexm)
qry =
select scrcod, screxmcod, scrstucod, scrsub, scrach, scrach
from tbscr, tbstu, tbexm
where scrstucod = stucod
and screxmcod = exmcod
and stucod = 101
and exmcod = 1001
now I want the second scrach in select to display data with respect to exmcod=1002 and Total columns to sum scrach and scrach
If i understood correctly,
Use Left Join:
select
tbscr1.scrcod,
tbscr2.scrcod ,
tbscr1.screxmcod,
tbscr2.screxmcod,
tbscr1.scrstucod
tbscr2.scrstucod,
tbscr1.scrsub,
tbscr2.scrsub
tbscr1.scrach,
tbscr2.scrach,
tbscr1.scrach+tbscr2.scrach AS Total
from tbstu,tbexm
left join
tbscr as tbscr1 on tbscr1.scrstucod =tbstu.stucod and tbscr1.screxmcod = tbexm.exmcod and tbstu.stucod = 101 and tbexm.exmcod =1001
left join
tbscr as tbscr2 on tbscr2 .scrstucod =tbstu.stucod and tbscr2 .screxmcod = tbexm.exmcod and tbstu.stucod = 101 and tbexm.exmcod =1002
you can also try:
select scrcod ,
screxmcod,
scrstucod,
scrsub,
scrach,
(select scrach from tbscr ,tbstu,tbexm
where scrstucod =stucod and screxmcod = exmcod and stucod = 101 and exmcod =1002) AS scrach2
from tbscr ,tbstu,tbexm
where scrstucod =stucod and screxmcod = exmcod and stucod = 101 and exmcod =1001
Based on what I understood, I think this you want to get the following for a given student:
exam information for two exams (1001 and 1002)
total score of the two exams
If that's correct, you can do something like this:
SELECT
sc1.scrcod, sc1.screxmcod, sc1.scrsub, sc1.scrach,
sc2.scrcod, sc2.screxmcod, sc2.scrsub, sc2.scrach,
COALESCE(sc1.scrach, 0) + COALESCE(sc2.scrach, 0) AS TotalScore
FROM tbstu st
LEFT JOIN tbscr sc1 ON st.stucod = sc1.scrstucod AND sc1.screxmcod = 1001 -- Exam 1 info
LEFT JOIN tbscr sc2 ON st.stucod = sc2.scrstucod AND sc2.screxmcod = 1002 -- Exam 2 info
WHERE st.stucod = 101 -- Only get info for student 101
Update
Based on your comments it looks like you want to also split the exam scores based on subject (scrsub). You can just add this field to your JOIN condition:
SELECT
st.stucod,
sc1.scrsub,
sc1.scrach,
sc2.scrach,
COALESCE(sc1.scrach,0) + COALESCE(sc2.scrach,0) AS TotalScore
FROM tbstu st
LEFT JOIN tbscr sc1 -- Exam 1 info
ON st.stucod = sc1.scrstucod AND sc1.screxmcod = 1001
LEFT JOIN tbscr sc2 -- Exam 2 info
ON st.stucod = sc2.scrstucod AND sc2.screxmcod = 1002 AND sc1.scrsub = sc2.scrsub
WHERE st.stucod = 101 -- Only get info for student 101
As coded, this query makes a few assumptions:
this will only work for exams 1001 and 1002
exam 1001 and 1002 have identical scrsub entries (i.e. 4 rows for each exam)
Let me know how that one works.

Strange LINQ joins

I've got a very strange behaviour in LINQ joins
I'm joining a IEnumerable collection and a view which i'm accessing through Entity Framework.
For example (numbers are column values):
Collection
1 1
1 2
View
1 3
1 4
Result of a join should be
1 1 1 3
1 1 1 4
1 2 1 3
1 2 1 4
And i get that result in T-SQL in managment studio and even using the same code in LinqPad,
but in VS i get
1 1 1 3
1 1 1 3
1 2 1 3
1 2 1 3
or
1 1 1 4
1 1 1 4
1 2 1 4
1 2 1 4
but never the correct join. I check Linq generated query through SQL Server Profiler and launched it in Managment Stuiod, and got the correct answer. Please help me to understand such very strange behaviour
var allocations = InvoicingContext.vAllocations.Where(x => auditIds.Contains(x.AuditGroupId.Value)).AsEnumerable();
var q = from a in allocations
join c in CommonCodesContext.vContainerEntity on a.ContainerId equals c.ContainerId
select new ContainerServiceModel
{
ContainerNo = a.ContainerNo,
PortATD = c.ATD,
ATA_KL = a.ServiceDate,
RateWithoutVat = a.RateWithoutVat,
DestinationCityId = c.DestinationCityId,
Quantity = 1
};
var containerServiceModels = q.ToList();
int destinationCount = containerServiceModels.Where(x => x.DestinationCityId == 14).Count();
Queries generated for Linq code (Visual Studio)
SELECT
[Extent1].[ShipperID] AS [ShipperID],
[Extent1].[CarrierId] AS [CarrierId],
[Extent1].[ShippingLineID] AS [ShippingLineID],
[Extent1].[TerminalId] AS [TerminalId],
[Extent1].[Terminal] AS [Terminal],
[Extent1].[ContainerId] AS [ContainerId],
[Extent1].[ContainerNo] AS [ContainerNo],
[Extent1].[ContTypeID] AS [ContTypeID],
[Extent1].[PortStorageDays] AS [PortStorageDays],
[Extent1].[UnloadDate] AS [UnloadDate],
[Extent1].[ATA] AS [ATA],
[Extent1].[ATD] AS [ATD],
[Extent1].[PortShipped] AS [PortShipped],
[Extent1].[IsSealed] AS [IsSealed],
[Extent1].[ATA_CY] AS [ATA_CY],
[Extent1].[ATD_CY] AS [ATD_CY],
[Extent1].[InspectionDate] AS [InspectionDate],
[Extent1].[OrderId] AS [OrderId],
[Extent1].[OrderTypeId] AS [OrderTypeId],
[Extent1].[StorageTypeId] AS [StorageTypeId],
[Extent1].[LoadRegionId] AS [LoadRegionId],
[Extent1].[LoadCityId] AS [LoadCityId],
[Extent1].[DestinationRegionId] AS [DestinationRegionId],
[Extent1].[DestinationCityId] AS [DestinationCityId],
[Extent1].[ODCYCustomer] AS [ODCYCustomer],
[Extent1].[ODCYShipped] AS [ODCYShipped],
[Extent1].[PortReturnDate] AS [PortReturnDate],
[Extent1].[IsReturnedToPort] AS [IsReturnedToPort],
[Extent1].[ODCYStorageDays] AS [ODCYStorageDays],
[Extent1].[DetentionDays] AS [DetentionDays],
[Extent1].[CCFinish] AS [CCFinish],
[Extent1].[FreeDaysForTrucker] AS [FreeDaysForTrucker],
[Extent1].[TruckingUnloadDays] AS [TruckingUnloadDays],
[Extent1].[TruckingEmptyReturnDays] AS [TruckingEmptyReturnDays],
[Extent1].[TruckingEmptyReturnDetentionDays] AS [TruckingEmptyReturnDetentionDays],
[Extent1].[LatePickUpDays] AS [LatePickUpDays]
FROM (SELECT
[vContainerEntity].[ShipperID] AS [ShipperID],
[vContainerEntity].[CarrierId] AS [CarrierId],
[vContainerEntity].[ShippingLineID] AS [ShippingLineID],
[vContainerEntity].[TerminalId] AS [TerminalId],
[vContainerEntity].[Terminal] AS [Terminal],
[vContainerEntity].[ContainerId] AS [ContainerId],
[vContainerEntity].[ContainerNo] AS [ContainerNo],
[vContainerEntity].[ContTypeID] AS [ContTypeID],
[vContainerEntity].[PortStorageDays] AS [PortStorageDays],
[vContainerEntity].[UnloadDate] AS [UnloadDate],
[vContainerEntity].[ATA] AS [ATA],
[vContainerEntity].[ATD] AS [ATD],
[vContainerEntity].[PortShipped] AS [PortShipped],
[vContainerEntity].[IsSealed] AS [IsSealed],
[vContainerEntity].[ATA_CY] AS [ATA_CY],
[vContainerEntity].[ATD_CY] AS [ATD_CY],
[vContainerEntity].[InspectionDate] AS [InspectionDate],
[vContainerEntity].[OrderId] AS [OrderId],
[vContainerEntity].[OrderTypeId] AS [OrderTypeId],
[vContainerEntity].[StorageTypeId] AS [StorageTypeId],
[vContainerEntity].[LoadRegionId] AS [LoadRegionId],
[vContainerEntity].[LoadCityId] AS [LoadCityId],
[vContainerEntity].[DestinationRegionId] AS [DestinationRegionId],
[vContainerEntity].[DestinationCityId] AS [DestinationCityId],
[vContainerEntity].[ODCYCustomer] AS [ODCYCustomer],
[vContainerEntity].[ODCYShipped] AS [ODCYShipped],
[vContainerEntity].[PortReturnDate] AS [PortReturnDate],
[vContainerEntity].[IsReturnedToPort] AS [IsReturnedToPort],
[vContainerEntity].[ODCYStorageDays] AS [ODCYStorageDays],
[vContainerEntity].[DetentionDays] AS [DetentionDays],
[vContainerEntity].[CCFinish] AS [CCFinish],
[vContainerEntity].[FreeDaysForTrucker] AS [FreeDaysForTrucker],
[vContainerEntity].[TruckingUnloadDays] AS [TruckingUnloadDays],
[vContainerEntity].[TruckingEmptyReturnDays] AS [TruckingEmptyReturnDays],
[vContainerEntity].[TruckingEmptyReturnDetentionDays] AS [TruckingEmptyReturnDetentionDays],
[vContainerEntity].[LatePickUpDays] AS [LatePickUpDays]
FROM [Tariff].[vContainerEntity] AS [vContainerEntity]) AS [Extent1]
and
SELECT
[Extent1].[id] AS [id],
[Extent1].[Payer] AS [Payer],
[Extent1].[Receiver] AS [Receiver],
[Extent1].[CustomerId] AS [CustomerId],
[Extent1].[CustomerName] AS [CustomerName],
[Extent1].[AuditGroupId] AS [AuditGroupId],
[Extent1].[ContainerId] AS [ContainerId],
[Extent1].[OrderId] AS [OrderId],
[Extent1].[ContainerNo] AS [ContainerNo],
[Extent1].[TariffId] AS [TariffId],
[Extent1].[ServiceTypeId] AS [ServiceTypeId],
[Extent1].[ServiceType] AS [ServiceType],
[Extent1].[ServiceDate] AS [ServiceDate],
[Extent1].[IsServiceDateClosed] AS [IsServiceDateClosed],
[Extent1].[InvoiceId] AS [InvoiceId],
[Extent1].[InvoiceNo] AS [InvoiceNo],
[Extent1].[InvoiceDate] AS [InvoiceDate],
[Extent1].[ReceiveDate] AS [ReceiveDate],
[Extent1].[DueDate] AS [DueDate],
[Extent1].[ResponsibleUser] AS [ResponsibleUser],
[Extent1].[Free] AS [Free],
[Extent1].[PaymentQty] AS [PaymentQty],
[Extent1].[RateWithoutVat] AS [RateWithoutVat],
[Extent1].[RateWithVat] AS [RateWithVat],
[Extent1].[AmountWithoutVat] AS [AmountWithoutVat],
[Extent1].[CommissionWithoutVat] AS [CommissionWithoutVat],
[Extent1].[TotalAmountWithoutVat] AS [TotalAmountWithoutVat],
[Extent1].[AmountWithVat] AS [AmountWithVat],
[Extent1].[CommissionWithVat] AS [CommissionWithVat],
[Extent1].[TotalAmountWithVat] AS [TotalAmountWithVat],
[Extent1].[VatSum] AS [VatSum],
[Extent1].[RateWithoutVatRub] AS [RateWithoutVatRub],
[Extent1].[RateWithVatRub] AS [RateWithVatRub],
[Extent1].[AmountWithoutVatRub] AS [AmountWithoutVatRub],
[Extent1].[CommissionAmountWithoutVatInRub] AS [CommissionAmountWithoutVatInRub],
[Extent1].[TotalAmountWithoutVatRub] AS [TotalAmountWithoutVatRub],
[Extent1].[AmountWithVatRub] AS [AmountWithVatRub],
[Extent1].[CommissionAmountWithVatInRub] AS [CommissionAmountWithVatInRub],
[Extent1].[TotalAmountWithVatRub] AS [TotalAmountWithVatRub],
[Extent1].[AmountVatRub] AS [AmountVatRub],
[Extent1].[CommissionVatRub] AS [CommissionVatRub],
[Extent1].[VatSumInRub] AS [VatSumInRub],
[Extent1].[CurrencyId] AS [CurrencyId],
[Extent1].[IncludeVat] AS [IncludeVat],
[Extent1].[VAT] AS [VAT],
[Extent1].[IncludeVatInCommission] AS [IncludeVatInCommission],
[Extent1].[ExchangeDate] AS [ExchangeDate],
[Extent1].[ExchangeDateForCommission] AS [ExchangeDateForCommission],
[Extent1].[ExchangeRate] AS [ExchangeRate],
[Extent1].[CommissionExchangeRate] AS [CommissionExchangeRate],
[Extent1].[AverageExchangeRate] AS [AverageExchangeRate],
[Extent1].[StatusId] AS [StatusId],
[Extent1].[Remark] AS [Remark],
[Extent1].[Author] AS [Author],
[Extent1].[DtCreated] AS [DtCreated]
FROM (SELECT
[vAllocations].[id] AS [id],
[vAllocations].[Payer] AS [Payer],
[vAllocations].[Receiver] AS [Receiver],
[vAllocations].[CustomerId] AS [CustomerId],
[vAllocations].[CustomerName] AS [CustomerName],
[vAllocations].[AuditGroupId] AS [AuditGroupId],
[vAllocations].[ContainerId] AS [ContainerId],
[vAllocations].[OrderId] AS [OrderId],
[vAllocations].[ContainerNo] AS [ContainerNo],
[vAllocations].[TariffId] AS [TariffId],
[vAllocations].[ServiceTypeId] AS [ServiceTypeId],
[vAllocations].[ServiceType] AS [ServiceType],
[vAllocations].[ServiceDate] AS [ServiceDate],
[vAllocations].[IsServiceDateClosed] AS [IsServiceDateClosed],
[vAllocations].[InvoiceId] AS [InvoiceId],
[vAllocations].[InvoiceNo] AS [InvoiceNo],
[vAllocations].[InvoiceDate] AS [InvoiceDate],
[vAllocations].[ReceiveDate] AS [ReceiveDate],
[vAllocations].[DueDate] AS [DueDate],
[vAllocations].[ResponsibleUser] AS [ResponsibleUser],
[vAllocations].[Free] AS [Free],
[vAllocations].[PaymentQty] AS [PaymentQty],
[vAllocations].[RateWithoutVat] AS [RateWithoutVat],
[vAllocations].[RateWithVat] AS [RateWithVat],
[vAllocations].[AmountWithoutVat] AS [AmountWithoutVat],
[vAllocations].[CommissionWithoutVat] AS [CommissionWithoutVat],
[vAllocations].[TotalAmountWithoutVat] AS [TotalAmountWithoutVat],
[vAllocations].[AmountWithVat] AS [AmountWithVat],
[vAllocations].[CommissionWithVat] AS [CommissionWithVat],
[vAllocations].[TotalAmountWithVat] AS [TotalAmountWithVat],
[vAllocations].[VatSum] AS [VatSum],
[vAllocations].[RateWithoutVatRub] AS [RateWithoutVatRub],
[vAllocations].[RateWithVatRub] AS [RateWithVatRub],
[vAllocations].[AmountWithoutVatRub] AS [AmountWithoutVatRub],
[vAllocations].[CommissionAmountWithoutVatInRub] AS [CommissionAmountWithoutVatInRub],
[vAllocations].[TotalAmountWithoutVatRub] AS [TotalAmountWithoutVatRub],
[vAllocations].[AmountWithVatRub] AS [AmountWithVatRub],
[vAllocations].[CommissionAmountWithVatInRub] AS [CommissionAmountWithVatInRub],
[vAllocations].[TotalAmountWithVatRub] AS [TotalAmountWithVatRub],
[vAllocations].[AmountVatRub] AS [AmountVatRub],
[vAllocations].[CommissionVatRub] AS [CommissionVatRub],
[vAllocations].[VatSumInRub] AS [VatSumInRub],
[vAllocations].[CurrencyId] AS [CurrencyId],
[vAllocations].[IncludeVat] AS [IncludeVat],
[vAllocations].[VAT] AS [VAT],
[vAllocations].[IncludeVatInCommission] AS [IncludeVatInCommission],
[vAllocations].[ExchangeDate] AS [ExchangeDate],
[vAllocations].[ExchangeDateForCommission] AS [ExchangeDateForCommission],
[vAllocations].[ExchangeRate] AS [ExchangeRate],
[vAllocations].[CommissionExchangeRate] AS [CommissionExchangeRate],
[vAllocations].[AverageExchangeRate] AS [AverageExchangeRate],
[vAllocations].[StatusId] AS [StatusId],
[vAllocations].[Remark] AS [Remark],
[vAllocations].[Author] AS [Author],
[vAllocations].[DtCreated] AS [DtCreated]
FROM [dbo].[vAllocations] AS [vAllocations]) AS [Extent1]
WHERE ([Extent1].[AuditGroupId] IN (9107)) AND ([Extent1].[AuditGroupId] IS NOT NULL)
Queries generated on LinqPAD test
exec sp_executesql N'SELECT [t0].[ContainerNo], [t1].[ATD] AS [PortATD], [t0].[ServiceDate] AS [ATA_KL], [t0].[RateWithoutVat], [t1].[DestinationCityId]
FROM [Invoicing_SPB].[dbo].[vAllocations] AS [t0]
INNER JOIN [Tariff].[vContainerEntity] AS [t1] ON ([t0].[ContainerId]) = [t1].[ContainerId]
WHERE ([t1].[DestinationCityId] = #p0) AND ([t0].[AuditGroupId] = #p1)',N'#p0 int,#p1 int',#p0=14,#p1=9107
I've tried to loop and get count of result collection dependting on predicate
Invoicing_SPBEntities invContext = new Invoicing_SPBEntities();
CommonCodesEntities ccContext = new CommonCodesEntities();
for (int i = 0; i <= 20; i++)
{
var allocations = (from a in invContext.vAllocations
where a.AuditGroupId == 9107
select a).AsEnumerable();
var q = from a in allocations
join c in ccContext.vContainerEntity on a.ContainerId equals c.ContainerId
select new
{
ContainerNo = a.ContainerNo,
PortATD = c.ATD,
ATA_KL = a.ServiceDate,
RateWithoutVat = a.RateWithoutVat,
OrderTypeId = c.OrderTypeId,
DestinationCityId = c.DestinationCityId,
Quantity = 1
};
var result = q.ToList();
Console.WriteLine(result.Where(x=>x.DestinationCityId == 14).ToList().Count);
}
Resulting console output
64
62
58
58
64
62
60
60
56
60
62
60
58
54
56
64
58
Very strange :D

How to select MAX ID using LINQ?

From the sql data below, I'd like to take a distinct EmpId that is the max ID.
ID EmpId DeptId
1 1002 XY
5 1100 ABC
6 1109 EF
7 1100 MN
9 1100 DE
10 1250 CE
11 1250 DJ
12 1100 DE
Results would look like the following:
ID EmpId DeptId
1 1002 XY
6 1109 EF
11 1250 DJ
12 1100 DE
How should this LINQ be structured?
var result = list.GroupBy(x=>x.EmpId).Select(g=>g.OrderByDescending(y=>y.Id).First());
from e in context.Employees
group e by e.EmpId into g
select new {EmpId = g.Key,
ID = g.OrderByDescending(gg=>gg.ID).FirstOrDefault().ID,
DeptId = g.OrderByDescending(gg=>gg.ID).FirstOrDefault().DeptId
}

Query to return pairs of related rows, but only when both rows exist

I have the following tables:
*sistema_documentos*
[id], [caminho], [idDocType](FK -> sistema_DocType.id)
*sistema_Indexacao*
[id] ,[idDocumento](FK -> sistema_documentos.id) ,[idIndice](FK ->
sistema_Indexes) ,[valor]
*sistema_DocType*
[id], [tipoNome](FK -> sistema_DocType.id)
*sistema_DocType_Index*
[id],[idName],[mask],[idTipo](FK -> sistema_DocType.id),[tamanho]
From this query:
select distinct a.id, b.idIndice, b.valor from tgpwebged.dbo.sistema_Documentos as a
join tgpwebged.dbo.sistema_Indexacao as b on a.id = b.idDocumento
join tgpwebged.dbo.sistema_DocType as c on a.idDocType = c.id
join tgpwebged.dbo.sistema_DocType_Index as d on c.id = d.docTypeId
where d.docTypeId = 40
and (b.idIndice = 11 AND b.valor = '11111111' OR b.idIndice = 12 AND b.valor = '22222' )
I get the following result
id idIndice valor
13 11 11111111
13 12 22222
14 11 11111111
14 12 22222
16 12 22222
As you can see, I want all ids with idIndice 11 with value 11111111 and 12 with value 22222
Id 16 has id 12 with value 22222 authough it does not have id 11 with value 11111111 so I donĀ“t want it to be shown.
How can I update my query to obtain the result I want. Hope my question is clear. If it is not just ask and I edit my post. Thanks
I would suggest something like this:
WITH TempTable AS
(
select distinct a.id, b.idIndice, b.valor
from tgpwebged.dbo.sistema_Documentos as a
join tgpwebged.dbo.sistema_Indexacao as b on a.id = b.idDocumento
join tgpwebged.dbo.sistema_DocType as c on a.idDocType = c.id
join tgpwebged.dbo.sistema_DocType_Index as d on c.id = d.docTypeId
where d.docTypeId = 40
and (b.idIndice = 11 AND b.valor = '11111111' OR b.idIndice = 12 AND b.valor = '22222' )
)
SELECT *
FROM TempTable t1
WHERE (select count(*)
from TempTable t2
where t1.id = t2.id AND t1.valor != t2.valor) = 1
So... get all the results from your first query where there is at least one result from the table that matches on id, but does not match on valor. (This assumes you could have duplicate rows with the same valor, but you wouldn't want that.)
Try something like this. I took out the tables that didn't have direct bearing on the query, although I named them similarly, and I created a simple schema to replicate the problem. I hope this is clear, and that the connection back to your original query is likewise clear.
CREATE TABLE Documentos (ID INT, document varchar(12))
create table Indexacao (AID INT, indice int, valor varchar(12))
insert Documentos(id, document)
values (1, 'test1'),
(2, 'test2'),
(3, 'test3')
insert Indexacao (aid, indice, valor)
values (1, 11, '11111111'),
(1, 12, '22222'),
(2, 12, '22222')
The important part of the code is the INTERSECT - it returns only rows that are in both sets. In my experience this operator is usually more efficient than anything containing an OR. In the query below, we are getting only those Indexacao rows whose idDocumentos are in the INTERSECT of the two sets of conditions.
SELECT Ind.*
FROM Indexacao Ind
JOIN (
SELECT D.ID
FROM Documentos D
JOIN Indexacao I
ON D.ID = I.AID
WHERE I.Indice = 11 AND I.valor = '11111111'
INTERSECT
SELECT D.ID
FROM Documentos D
JOIN Indexacao I
ON D.ID = I.AID
WHERE I.Indice = 12 AND I.valor = '22222'
)Doc (ID)
ON Doc.ID = Ind.AID
This assumes that you don't have duplicate Indice, Valor rows for a single idDocumento - if you do, you will need to add a DISTINCT.

Categories

Resources