c # Linq выберите присоединиться к выбранной группе - PullRequest
4 голосов
/ 15 июня 2011

У меня есть такой оператор MS-SQL:

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'

и хотел бы сделать это в linq. Я сделал вышеупомянутый запрос, разделенный на многократные запросы, выполнение которых не быстро. Существует ли соединение linq to linq

Мой код C #:

            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();
                }
            }

Я хотел бы получить все контакты с 1-2 запросами, а не с 1 запросом, а затем для каждого контакта другой запрос ...

Пожалуйста, помогите мне!

Ответы [ 2 ]

7 голосов
/ 15 июня 2011

Да, в Linq to SQL реализовано внутреннее соединение:

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
1 голос
/ 18 августа 2014

защищенный 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();
        }
...