Linq запрос эквивалентен существует с несколькими условиями - PullRequest
0 голосов
/ 27 февраля 2019

Я уже некоторое время пользуюсь linq, но нигде не сталкивался с такой ситуацией, и мой google-fu меня подвел.

В основном у меня есть два набора данных, которые я не определил, итеперь приходится использовать для возврата данных.

class Header 
{
    string COMPANY_CODE
    string REFERENCE_NBR
    string REFERENCE_DUPLICATE
    ...
}

class Line 
{
    string COMPANY_CODE
    string REFERENCE_NBR
    string REFERENCE_DUPLICATE
    string STOCK_CODE
    string DESCRIPTION
    ...
}

С точки зрения базы данных они объединяются следующим образом

select *
from Header
inner join Line
    on header.COMPANY_CODE = Line.COMPANY_CODE
    and header.REFERENCE_NBR = Line.REFERNCE_NBR
    and header.REFERENCE_DUPLICATE = LINE.REFERENCE_DUPLICATE

и имеют отношение 1: Многие.

Я реализую функцию поиска для спискаэто означает поиск любых строк со значением в STOCK_CODE или DESCRIPTION, которое соответствует заданному поисковому запросу.Я видел несколько способов объединения с использованием запроса linq, но из-за нескольких условий соединения я немного растерялся и не нашел примеров того, что я пытаюсь сделать.

Если бы я былнаписать заявление, которое я пытаюсь получить в lamda / linq в SQL, это будет:

declare @searchtxt nvarchar(max) = 'test'

Select * 
from header h
where exists (
    select *
    from Line l
    where
        (
            l.stock_code like '%'+@searchtxt+'%' 
            or l.description like '%'+@searchtxt+'%'
        )
        and h.COMPANY_CODE = l.COMPANY_CODE
        and h.REFERENCE_NBR = l.REFERENCE_NBR
        and h.REFERENCE_DUPLICATE = l.REFERENCE_DUPLICATE
    )

Любая помощь будет признательна!

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019
   db.Header.Join(
            db.Line,
            h => new { h.COMPANY_CODE, h.REFERENCE_NBR, h.REFERENCE_DUPLICATE },
            l => new { l.COMPANY_CODE, l.REFERENCE_NBR, l.REFERENCE_DUPLICATE },
            (h, l) => new
            {
                Header_COMPANY_CODE = h.COMPANY_CODE,
                Header_REFERENCE_NBR = h.REFERENCE_NBR,
                Header_REFERENCE_DUPLICATE = h.REFERENCE_DUPLICATE,
                Line_Company_Code = l.COMPANY_CODE,
                Line_REFERENCE_NBR = l.REFERENCE_NBR,
                Line_REFERENCE_DUPLICATE = l.REFERENCE_DUPLICATE,
                Line_STOCK_CODE = l.STOCK_CODE,
                Line_DESCRIPTION = l.DESCRIPTION
            }
            )
            .Where(w => w.Line_STOCK_CODE.Contains(searchText) || w.Line_DESCRIPTION.Contains(searchText))
            .ToList();
0 голосов
/ 27 февраля 2019

Это традиционный запрос LINQ для лучшего понимания,

string searchtext = "";
var result = (from h in context.Headers
              join l in context.Lines on new { h.COMPANY_CODE, h.REFERENCE_DUPLICATE, h.REFERENCE_NBR } equals new { l.COMPANY_CODE, l.REFERENCE_DUPLICATE, l.REFERENCE_NBR }
              where l.STOCK_CODE.Contains(searchtext) || l.DESCRIPTION.Contains(searchtext)
              select new
              {
                  COMPANY_CODE = h.COMPANY_CODE,
                  STOCK_CODE = l.STOCK_CODE

                  //You can select more fields from "h" and "l"
              }).ToList();

Редактировать:

string searchtext = "";
var result = (from h in context.Headers
              join l in context.Lines on new { h.COMPANY_CODE, h.REFERENCE_DUPLICATE, h.REFERENCE_NBR } equals new { l.COMPANY_CODE, l.REFERENCE_DUPLICATE, l.REFERENCE_NBR }
              where l.STOCK_CODE.Contains(searchtext) || l.DESCRIPTION.Contains(searchtext)
              select h
              )
              .GroupBy(x => new { x.COMPANY_CODE, x.REFERENCE_DUPLICATE, x.REFERENCE_NBR })
              .Select(x => x.First())
              .ToList();
0 голосов
/ 27 февраля 2019

Может быть, это?

var result = header.Where(h => 
    Line.Any(l => (l.stock_code.Contains(searchtxt)
                  || l.description.Contains(searchtxt))
               && h.COMPANY_CODE == l.COMPANY_CODE
               && h.REFERENCE_NBR == l.REFERENCE_NBR
               && h.REFERENCE_DUPLICATE == l.REFERENCE_DUPLICATE));
...