All,
This is my first post to this forum and I have searched all throughout this site to find an answer to my question, but it looks like there is not an example of what I need to do.
Below is a SQL query I need to adapt to a LINQ statement:
select COUNT(pe2.*)
from SomeTable pe1
inner join SomeTable pe2 on (pe2.Id=pe1.Id and pe2.TypeCode='X')
where pe1.TypeCode='Y'
I have tried to join this as illustrated below, but it doesn't work:
var query = (from pe2 in SomeTable
join pe1 in SomeTable
on new { pe1.Id } equals new {pe2.Id }
where pe2.TypeCode == "X"
&& pe1.TypeCode == "Y"
select pe2).Count();
Since the TypeCode is HardCoded you can pass it to the where clause
select pe2.*
from SomeTable pe1
inner join SomeTable pe2 on pe2.Id=pe1.Id
where pe1.TypeCode='Y'
and pe2.TypeCode='X'
And here it's how I would do it in linq
var l1 = new List<dynamic> { new { Id = 1, Code = "X" }, new { Id = 2, Code = "Y" } };
var l2 = new List<dynamic> { new { Id = 1, Code = "Y" }, new { Id = 2, Code = "X" } };
//lambda expression
l1.Join(l2,
x => x.Id,
y => y.Id,
(x, y) => new { Pe1 = x, Pe2 = y })
.Where(x => x.Pe1.Code == "Y" && x.Pe2.Code == "X")
.Select(x => x.Pe2);
//query...
from x in l1
join y in l2 on x.Id equals y.Id
where x.Code == "Y"
&& y.Code == "X"
select y
from x in l1
from y in l2
where x.Id == y.Id
&& x.Code == "Y"
&& y.Code == "X"
select y
Related
i try to get results from table with multiple where and/or clauses.
My SQL statement is:
select *
from ceri.movimentacao_parcela_repasse mpr
inner join ceri.movimentacao_parcela mp on (mp.id_movimentacao_parcela = mpr.id_movimentacao_parcela)
inner join ceri.pedido p on (p.id_pedido = mp.id_pedido)
inner join ceri.produto pd on (pd.id_produto = p.id_produto)
where mpr.id_repasse = 4
and mpr.in_repasse_aberto = 'S'
and ( (pd.id_grupo_produto = 1 and p.id_situacao_pedido_grupo_produto = 7 ) or (pd.id_grupo_produto = 2
and p.id_situacao_pedido_grupo_produto = 17) )
My Code in Laravel is:
first attempt
->where('movimentacao_parcela_repasse.id_repasse', '=', DB::raw('4'))
->where('movimentacao_parcela_repasse.in_repasse_aberto', '=', DB::raw('\'S\''))
->where(function($query) {
$query->where('produto.id_grupo_produto',DB::raw('1')) //-- 1 Pesquisa
->where('produto.id_situacao_pedido_grupo_produto',DB::raw('7')); // 7 -- Finalizado
})
->orWhere(function($query) {
$query->where('produto.id_grupo_produto',DB::raw('2')) //2 Certidão /
->where('produto.id_situacao_pedido_grupo_produto',DB::raw('17')); //17 -- Finalizado
});
// RESULT
and ("produto"."id_grupo_produto" = 1 and "pedido"."id_situacao_pedido_grupo_produto" = 7) or ("produto"."id_grupo_produto" = 2 and "pedido"."id_situacao_pedido_grupo_produto" = 17)
second attempt
->where('movimentacao_parcela_repasse.id_repasse', '=', DB::raw('4'))
->where('movimentacao_parcela_repasse.in_repasse_aberto', '=', DB::raw('\'S\''))
->where(function($query) {
$query->where('produto.id_grupo_produto',DB::raw('1'))
->where('pedido.id_situacao_pedido_grupo_produto',DB::raw('7'))
->orWhere(function($query) {
$query->where('produto.id_grupo_produto',DB::raw('2'))
->where('pedido.id_situacao_pedido_grupo_produto',DB::raw('17'));
});
});
// RESULT
and ("produto"."id_grupo_produto" = 1 and "pedido"."id_situacao_pedido_grupo_produto" = 7 or ("produto"."id_grupo_produto" = 2 and "pedido"."id_situacao_pedido_grupo_produto" = 17))
I do not want the way i wanted
and ( (pd.id_grupo_produto = 1 and p.id_situacao_pedido_grupo_produto = 7 ) or (pd.id_grupo_produto = 2 and p.id_situacao_pedido_grupo_produto = 17) )
Try this:
->where('movimentacao_parcela_repasse.id_repasse', '=', DB::raw('4'))
->where('movimentacao_parcela_repasse.in_repasse_aberto', '=', DB::raw('\'S\''))
->where(function($query) {
->where(function($query) {
$query->where('produto.id_grupo_produto',DB::raw('1'))
->where('pedido.id_situacao_pedido_grupo_produto',DB::raw('7'))
})
->orWhere(function($query) {
$query->where('produto.id_grupo_produto',DB::raw('2'))
->where('pedido.id_situacao_pedido_grupo_produto',DB::raw('17'));
});
});
I have a table with products that can be in different locations to be submited to a rework task, but i need to pick only the most recent one based on the product.
I have the following table:
ID Tag Location task Date
1 1 A T1 2016/06/01
2 1 B T1 2016/07/01
3 2 A T1 2016/06/01
4 2 A T2 2016/07/01
i ned the select the row of the Tags with most recent Date to have in output the row with ID 2 and ID 4.
What is the correct linq query for that?
First group by tag then select max date
var result = db.Table.GroupBy(i => i.Tag).Select(i => new
{
Tag = i.Key,
Date = i.Max(t => t.Date)
}).ToList();
Updated 1 (Comment 1)
var result = (from x in db.Table
join z in (db.Table.GroupBy(i => i.Tag).Select(i => new
{
Tag = i.Key,
Date = i.Max(t => t.Date)
})
) on new { A = x.Tag, B = x.Date} equals { A = z.Tag, B = z.Date }
select x).ToList();
Update 2 (Comment 2)
var result = (from x in db.Table
join z in (db.Table.GroupBy(i => new { i.Tag, i.Task }).Select(i => new
{
Tag = i.Key.Tag,
Task = i.Key.Task,
Date = i.Max(t => t.Date)
})
) on new { A = x.Tag, B = x.Date, C = x.Task} equals { A = z.Tag, B = z.Date, C = z.Task }
select x).ToList();
I have two tables.First is CompetitionUsers and Competitionpoints.
There is foreign key relationship between tables with ParticipateID.
In CompetitionPoints Table there are points different points for multiple participateID.So I want to fetch Total Points and the Rank based on total points.So if there is multiple same total points for one participateID, the rank for that participateid should be same .Its same like student Total marks and Rank from that Mark.
Here is my code.
var competitionusers = (from c in db.CompetitionUsers
group c by new { c.ParicipateId, c.CompetitionPoints.FirstOrDefault().Points }
into g orderby g.Key.Points descending select
new { Points = db.CompetitionPoints.Where
(x => x.ParticiapteId == g.FirstOrDefault().ParicipateId).Sum(x => x.Points),
Rank = (from o in db.CompetitionUsers
group o by o.CompetitionPoints.FirstOrDefault().Points into l
select l).Count(s => s.Key > db.CompetitionPoints.
Where(x => x.ParticiapteId == g.FirstOrDefault().ParicipateId).Sum(x => x.Points)) + 1,
}).Where(x => x.Points != null).OrderByDescending(x => x.Points).AsQueryable();
If I understand your data model correctly, I think you could simplify to something like this:
var result = db.CompetitionUsers
// group by total points
.GroupBy(cu => cu.CompetitionPoints.Sum(cp => cp.Points))
// order by total points descending
.OrderByDescending(g => g.Key)
// calculate rank based on position in grouped results
.SelectMany((g, i) => g.Select(cu => new { Rank = i+1, TotalPoints = g.Key, CompetitionUser = cu }));
IQueryable<CompetitionLaderMadel> competitionUsers;
competitionUsers = (from c in db.CompetitionUsers
select new CompetitionLaderMadel
{
CompetitionName = c.Competition.CompetitionName,
CompetitionId = c.CompetitionId,
Points = db.CompetitionPoints.Where(x => x.ParticiapteId == c.ParicipateId).Sum(x => x.Points),
IsFollow = db.CrowdMember.Any(x => x.Following == userid && x.UserCrowd.UserID == c.UserId && x.Status != Constants.Deleted),
}).Where(x => x.Points != null && x.UserId != null).OrderByDescending(x => x.Points);
And then Wrote this Query
var q = from s in competitionUsers
orderby s.Points descending
select new
{
CompetitionName = s.CompetitionName,
CompetitionId = s.CompetitionId,
HeadLine = s.HeadLine,
UserId = s.UserId,
Points = s.Points,
Image = s.Image,
IsFollow = s.IsFollow,
UserName = s.UserName,
Rank = (from o in competitionUsers
where o.Points > s.Points
select o).Count() + 1
};
Guy's I need a Lambda expression for this sql statement.
select GalleryId, Max(Bid)
from BidModels
where GalleryId in (select GalleryId from BidModels where UserId = (UserId))
group by GalleryId
I don't see why you need the subquery, given that you can just select all Bids where UserId = userid being passed in. With that in mind:
var userid = <whatever>;
var query = from b in BidModels
where b.UserId = userid
group by b.GalleryId into g
select new {Id = g.Key, MaxBid = g.Max(x => x.Bid)};
Here is how you can do it
var galleryIds = (bidModelses.Where(b => b.UserId == [YOURPARAMETER])
.Select(b => b.GalleryId));
var query = (bidModelses.Where(bm => galleryIds.Contains(bm.GalleryId))
.GroupBy(bm => bm.GalleryId)
.Select(gbm => new {gbm.Key, MaxBid = gbm.Max(p => p.BidId)}));
This seems to be the answer thanks for the help:
from b in BidModels
let MyGallery = from a in BidModels where a.UserId == (1) select new { a.GalleryId }
where MyGallery.Any()
group b.Bid by b.GalleryId into g
select new
{ Id = g.Key,
MaxBid = g.Max()
}
I have a working sql statement and want it as linq statement or linq methode chain.
My statement is:
SELECT T1.*
FROM (SELECT Col1, MAX(InsertDate) as Data
FROM Zugbewegungsdaten
GROUP BY Loknummer) as temp JOIN T1
ON (T1.Col1= temp.Col1
AND Zugbewegungsdaten.InsertDate= temp.Date)
WHERE Col3=1
ORDER BY Loknummer
Can anybody help me to translate it?
Edit after comment:
Ok, my result for the inner select:
var maxResult = (from data in context.T1
group data by data.Col1
into groups
select new
{
Train = groups.Key,
InsertDate= groups.Max( arg => arg.InsertDate)
}) ;
I tried the join like this:
var joinedResult = from data in context.T1
join gdata in maxResult on new
{
data.Col1,
data.InsertDate
}
equals new
{
gdata.Col1,
gdata.InsertDate
}
select data;
But i get a compiler error by the join that the typeargument are invalid.
In the case that the join works i whould use a where to filter the joinedResult.
var result = from data in joinedResult
where data.Col3 == true
select data;
After much more "try and error", I got this version it looks like it works.
var joinedResult = ( ( from data in context.T1
group data by data.Col1
into g
select new
{
Key= g.Key,
Date = g.Max( p => p.InsertDate)
} ) ).Join( context.T1,
temp => new
{
Key = temp.Key,
InsertDate = temp.Date
},
data => new
{
Key = data.Col1,
InsertDate = data.InsertDate
},
( temp,
data ) => new
{
temp,
data
} )
.Where( arg => arg.data.Col3)
.OrderBy( arg => arg.data.Col1)
.Select( arg => arg.data );
Could it be that i have to set the same property names (Key, InsertDate) by joins over multi columns?