Да, я использую Entity Framework. Все мои отношения определены правильно. Теперь я получаю эту ошибку: «LINQ to Entities не распознает метод« System.String Join [Char] (System.String, System.Collections.Generic.IEnumerable`1 [System.Char]) »и этот метод не может быть переведено в выражение магазина. " - см. мой модифицированный код внизу моего исходного поста.

у объединить результаты из 4 таблиц и выбрать конкретные поля с помощью LINQ. Пожалуйста, потерпите меня, поскольку я не выполнял сложные запросы LINQ.

Таблица 1 - Абонент

Таблица 2 - Подписка

Таблица 3 - Состояние

Таблица 4 - Страна

ПРИМЕЧАНИЕ. Подписчик может иметь 0, 1 или несколько подписок. Это означает, что внешний ключ (SubscriberID) является частью таблицы подписки.

Запрос должен вернуть каждого подписчика из таблицы подписчиков один раз. Имеет ли подписчик подписку или нет, не имеет значения. Мне нужно, чтобы все мои подписчики были в списке результатов.

Вот где это становится сложным:

В список результатов я хочу включить свойство 'PubName'. Это свойство представляет собой разделенную запятыми строку с именами пабов, на которые подписчик подписан. PubName - это столбец в таблице подписки.

Я написал хранимую процедуру в SQL, используя дополнительную функцию для создания поля PubName для каждого подписчика.

Например: наш список состоит из 3 строк:

Виктор, 123 W 45th # 43, Нью-Йорк, Нью-Йорк, «Маг А, Маг Б, Маг С»

(Виктор подписан на Mag A, B и C)

Дан, 564 E 23-й FL3, Нью-Йорк, Нью-Йорк, «Mag A, Mag D, Mag F»

(Дан подписан на Mag A, D и F)

Николь, 78 E 12th # 3, Нью-Йорк, Нью-Йорк, «NULL»

(У Николь нет подписок)

    var model = await (
                from subscriber in db.Subscribers
                    // left join
                from state in db.States.Where(s => s.State_ID == subscriber.SubscriberState_ID).DefaultIfEmpty()
                    // left join
                from country in db.Countries.Where(s => s.Country_ID == subscriber.SubscriberCountry_ID).DefaultIfEmpty()                                   

                orderby subscriber.Subscriber_ID descending

                select new SubscriberGridViewModel
                {
                    Subscriber_ID = subscriber.Subscriber_ID, 
                    Pub = GetPubName(subscriber.Subscriber_ID).ToString(),                        
                    FirstName = subscriber.SubscriberFirstName,
                    LastName = subscriber.SubscriberLastName,
                    Address1 = subscriber.SubscriberAddress1,
                    Address2 = subscriber.SubscriberAddress2,
                    Email = subscriber.SubscriberEmail,
                    Organization = subscriber.SubscriberOrganizationName,
                    Phone = subscriber.SubscriberPhone,                                                
                    Zip = subscriber.SubscriberZipcode
                }).ToListAsync();

    private static string GetPubName(int? subscriber_id)
    {
        string pubs = string.Empty;

        try
        {
            var db = new CirculationEntities();

            var model = db.Subscriptions.Where(s => s.Subscriber_ID == subscriber_id).ToList();

            foreach(Subscription sub in model)
            {
                if (string.IsNullOrEmpty(pubs))
                    pubs = sub.SubscriptionPublication;
                else
                    pubs = ", " + sub.SubscriptionPublication;
            }

            return pubs;
        }
        catch
        {
            return "EMPTY";
        }                
    }

с помощью следующего кода я получаю эту ошибку:

«LINQ to Entities не распознает метод метода« System.String GetPubName (System.Nullable`1 [System.Int32]) », и этот метод нельзя преобразовать в выражение хранилища».

Я понимаю ошибку. Метод не может быть преобразован в выражение хранилища внутри инструкции LINQ.

Возможно ли добиться этого в LINQ? Если так, может кто-нибудь показать мне, как? Я не могу найти решение.

Выяснил, как связать нить:

var query = from subscription in db.Subscriptions.ToList()
            group subscription by subscription.Subscriber_ID into g
            select new
            {
                Subscriber_ID = g.Key,
                Pub = string.Join(", ", g.Select(x => x.SubscriptionPublication).Distinct())
            };


var model = (from s in query
             join subscriber in db.Subscribers on s.Subscriber_ID equals subscriber.Subscriber_ID
             join state in db.States on subscriber.SubscriberState_ID equals state.State_ID
             join country in db.Countries on subscriber.SubscriberCountry_ID equals country.Country_ID 
             select new SubscriberGridViewModel
             {
                 Subscriber_ID = subscriber.Subscriber_ID,
                 Pub = s.Pub,
                 FirstName = subscriber.SubscriberFirstName,
                 LastName = subscriber.SubscriberLastName,
                 Address1 = subscriber.SubscriberAddress1,
                 Address2 = subscriber.SubscriberAddress2,
                 Email = subscriber.SubscriberEmail,
                 Organization = subscriber.SubscriberOrganizationName,
                 Phone = subscriber.SubscriberPhone,
                 City = subscriber.SubscriberCity,
                 State = (subscriber.SubscriberState_ID == 54) ? subscriber.SubscriberState : state.StateName,
                 StateAbbv = (subscriber.SubscriberState_ID == 54) ? subscriber.SubscriberState : state.StateAbbreviation,
                 Country = country.CountryName,
                 Zip = subscriber.SubscriberZipcode
             }).ToList();

Результаты не включают подписчиков без подписок. Есть идеи как это исправить?

Ответы на вопрос(1)

Ваш ответ на вопрос