2011-04-11 3 views
12

Я не могу понять, что linq для синтаксиса запроса сущности. Моя проблема заключается в том, что если значение таблицы «Вызовы» равно null, то заметка появляется, я хочу сделать что-то вроде левого соединения, чтобы получить «все» строки из таблицы «Вызовы».Left Join Linq to Entity's Vb.net

Я попытался сгруппировать его, но я не могу понять, как правильно его написать.

Dim TicketQuery As ObjectQuery = From c In EnData.Customer _ 
             Join t In EnData.Calls On t.CustomerID Equals c.CustomerID _ 
             Join Status In EnData.Lists On t.Status Equals Status.ListValue _ 
             Join Project In EnData.Lists On t.Project Equals Project.ListValue _ 
             Join Priorty In EnData.Lists On t.Priority Equals Priorty.ListValue _ 
             Where c.Status > -1 And t.Status > -1 And Status.ListType = 1 And Project.ListType = 3 And Priorty.ListType = 2 _ 
     Select New With {c.CustName, t.CallID, t.CallDate, t.CallTime, t.Description, Key .Status = Status.ListText, Key .Project = Project.ListText, t.DateModified, Key .Priority = Priorty.ListText} 

Как это исправить?

+0

Можете ли вы объяснить данные, которые вы хотите увидеть, как результат? – Jeremy

+0

Если вы создаете классы Dummy, вы можете протестировать LINQ в LINQPad http://www.linqpad.net/ – Jeremy

ответ

30

Похожий вопрос: Linq to Sql: Multiple left outer joins

Microsoft Документация: http://msdn.microsoft.com/en-us/library/bb918093.aspx#Y916

LINQ Примеры из: http://msdn.microsoft.com/en-us/vbasic/bb737909

левое внешнее соединение так называемого внешнего соединения можно выразить с группой присоединиться. Левое внешнее соединение подобно крестному соединению, за исключением того, что все элементы левой стороны включаются хотя бы один раз, даже если они не соответствуют элементам правой стороны. Обратите внимание, как овощи появляются на выходе, даже если у него нет подходящих продуктов.

Public Sub Linq105() 
    Dim categories() = {"Beverages", "Condiments", "Vegetables", "Dairy Products", "Seafood"} 

Dim productList = GetProductList() 

Dim query = From c In categories _ 
      Group Join p In productList On c Equals p.Category Into Group _ 
      From p In Group.DefaultIfEmpty() _ 
      Select Category = c, ProductName = If(p Is Nothing, "(No products)", p.ProductName) 

For Each v In query 
    Console.WriteLine(v.ProductName + ": " + v.Category) 
Next 
End Sub 
2

для левостороннего присоединиться к VB.net мы можем использовать Пусть

Dim q = 
    (From item In _userProfileRepository.Table 
    Let Country = (From p In _countryRepository.Table Where p.CountryId = item.CurrentLocationCountry Select p.Name).FirstOrDefault 
    Let State = (From p In _stateRepository.Table Where p.CountryId = item.CurrentLocationCountry Select p.Name).FirstOrDefault 
    Let City = (From p In _stateRepository.Table Where p.CountryId = item.CurrentLocationCountry Select p.Name).FirstOrDefault 
    Where item.UserId = item.ProfileId.ToString) 

После левое соединение можно использовать группу по

Dim q2 = 
    (From p In q Group p By p.Country, p.State, p.City Into Group 
    Select New With 
     { 
      .Country = Country, 
      .State = State, 
      .City = City, 
      .Count = Group.Count 
     }).ToList()