Преобразование Sql-запроса с 2 «левым соединением» и несколькими условиями в запрос структуры объекта - PullRequest
0 голосов
/ 15 мая 2018

Я пытался преобразовать этот SQL-запрос

Select * 
from (
    select SenDa.*,Prod.ProductKHK,FCod.FailCodeDesc  
    from databa.dbo.SensorData as SenDa 
    left join Products as Prod on SenDa.ProductID = Prod.ProductID
    left join FailCodes as FCod on SenDa.FailCode = FCod.FailCode and (FCod.ProdLineID =0 or FCod.ProdLineID = FCod.ProdLineID)
) as SenDa

до Linq так:

var SensDatJoinFail = (from SensDat in Jas_en.SenDatas
join Prod in Jas_en.Products on 
SensDat.ProductID equals Prod.ProductID
join FCod in Jas_en.FailCodes on SensDat.FailCode equals FCod.FailCode1
where FCod.ProdLineID == 0 || FCod.ProdLineID == FCod.ProdLineID

                               select new
                          {
                              Serial_No = SensDat.Serial_No,
                              OrderID = SensDat.OrderID,
                              Artikelnummer = Prod.ProductKHK,
                              StartProcTime = SensDat.StartProcTime,
                              EndProcTime = SensDat.EndProcTime,
                              Packaged = SensDat.Packaged,
                              Labeled = SensDat.Labeled,
                              Reworked = SensDat.Reworked,
                              LastStation = SensDat.LastStation,
                              FailCode = SensDat.FailCode,

                              FailCodeDesc = FCod.FailCodeDesc,

                          });

но я получаю разницу в результате запроса в количестве строк

Не знаю, в чем проблема?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы получаете меньше строк, потому что вы используете inner join вместо left join.Попробуйте что-то вроде этого:

var result= from table1 in dbo.Table1 
            from table2 in dbo.Table2
                           .Where(i=>i.Id == table1.Id)
                           .DefaultIfEmpty();

или вы можете посмотреть, как Выполнить левые внешние объединения

    Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
    Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
    Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
    Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };

    Pet barley = new Pet { Name = "Barley", Owner = terry };
    Pet boots = new Pet { Name = "Boots", Owner = terry };
    Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
    Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
    Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

    // Create two lists.
    List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
    List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };

    var query = from person in people
                join pet in pets on person equals pet.Owner into gj
                from subpet in gj.DefaultIfEmpty()
                select new { person.FirstName, PetName = subpet?.Name ?? String.Empty };
0 голосов
/ 15 мая 2018

Это EF FAQ.Не используйте JOINS в LINQ to Entitites.Просто перейдите в свойства навигации.Что-то вроде:

   from SensDat in Jas_en.SenDatas
    select new
    {
      Serial_No = SensDat.Serial_No,
      OrderID = SensDat.OrderID,
      Artikelnummer = SensDat.Product.ProductKHK,
      StartProcTime = SensDat.StartProcTime,
      EndProcTime = SensDat.EndProcTime,
      Packaged = SensDat.Packaged,
      Labeled = SensDat.Labeled,
      Reworked = SensDat.Reworked,
      LastStation = SensDat.LastStation,
      FailCode = SensDat.FailCode,
      FailCodeDesc = SensDat.FailCode.FailCodeDesc,
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...