Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c# Linq select join on select group by

I have this MS-SQL statement :

SELECT cv.id FROM ContactValue cv
INNER JOIN (
        SELECT mainId, max(version) as v
        FROM ContactValue
        WHERE version <= $Version(int)
        GROUP BY mainId
) 
AS t ON t.mainId = cv.mainId AND t.v = cv.version 
WHERE cv.contact_id = $ContactID(int) 
      AND cv.isActive = 1 
      ORDER BY sort'

and would like to make it in linq. I did make above query divided into multiple queries witch performence is not fast. Does it exist any linq to linq joining

My C# code :

            var groupMax = from cv in db.ContactValue
                           where cv.contact_id == ContactID && cv.version <= Version
                           orderby cv.sort
                           group cv by cv.mainId into gcv
                           select new { mainID = gcv.Key, version = gcv.Max(cv => cv.version) };

            foreach (var data in groupMax.ToList())
            {
                var Query = from cv in db.ContactValue
                            where cv.contact_id == ContactID && cv.mainId == data.mainID && cv.version == data.version && cv.isActive == true
                            select cv;

                if (Query.Count() > 0)
                {
                    ContactValue tmp = Query.First();
                }
            }

I would love to get all contacts with 1-2 queries not 1 query then for each contact another query...

Please help me !

like image 650
Illusion Avatar asked Feb 24 '23 21:02

Illusion


2 Answers

Yes, Linq to SQL does have an inner join implemented:

var groupMax =
    from cv in db.ContactValue
    where cv.contact_id == ContactID && cv.version <= Version
    orderby cv.sort
    group cv by cv.mainId into gcv
    select new { mainID = gcv.Key, version = gcv.Max(cv => cv.version) };

var res =
    from cv in db.ContactValue
    join gm in groupMax on cv.version equals gm.version
    where cv.contact_id == ContactID && cv.isActive
    orderby cv.version ascending /*for example*/
    select cv
like image 72
Andrei Avatar answered Mar 03 '23 01:03

Andrei


protected void rptPriceRachiveBind() {

        using (MyEntities ctx = new MyEntities())
        {


            var catRef = Convert.ToInt32(Request.QueryString["CategoryRef"]);
            var prodCounts = (
          from A in ctx.Products
          join B in ctx.ProductPrices
              on A.ProductId equals B.ProductRef
          where A.CategoryRef == catRef

          group A by new { A.Name,B.ProductRef } into catGp

          select
              new
              {
                 catGp.Key.ProductRef,
                  catGp.Key.Name,
                  proIdCount = catGp.Count()

              }).ToList();

              Repeater1.DataSource = prodCounts;

            Repeater1.DataBind();
        }
like image 37
Asal Avatar answered Mar 03 '23 01:03

Asal