SubSonic 3 Linq Присоединиться Проблемы - PullRequest
2 голосов
/ 25 августа 2009

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

        var query = from c in db.CountyLookups
                    join s in db.StateLookUps on
                    c.StateLookupID equals
                    s.StateLookupID
                    where c.Name2 == countyName &&
                    s.Abbr == stateAbbr
                    select new
                    {
                        Latitude = c.Latitude,
                        Longitude = c.Longitude
                    };

        var result = query.SingleOrDefault();

но когда вызывается .SingleOrDefault (), я получаю жёлтый экран с проклятой надписью:

System.NotSupportedException: элемент 'StateLookupID' не поддерживается

трассировка стека заканчивается на:

SubSonic.Linq.Structure.TSqlFormatter.VisitMemberAccess(MemberExpression m) 

столбец StateLookupID имеет подчеркивание в базе данных и является обычным int pk / fk.

что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 27 августа 2009

Так что, очевидно, VisitMemberAccess не имеет представления, что делать с int, только строкой и датой (начиная со строки 152 SubSonic.Linq.Structure.TSqlFormatter). Я не знаю, почему это вызывается при объединении, так как объединение обычно происходит между int pk / fk (или guid, если хотите).

В итоге я отказался от запроса linq в пользу SubSonic.Query.Select. Вот мой новый код, который работает:

        var query = db.Select.From<CountyLookup>()
            .InnerJoin<StateLookUp>()
            .Where(CountyLookupTable.Name2Column)
            .IsEqualTo(countyName)
            .And(StateLookUpTable.AbbrColumn)
            .IsEqualTo(stateAbbr);

Затем я вызываю ExecuteTypedList и отображаю результаты обратно в класс моей модели. Работает как бутах. Просто хотел использовать linq в этом случае.

0 голосов
/ 12 октября 2009

Это все еще кажется проблемой; а именно в простых случаях, таких как:

var list = from lang in db.Languages
                       join site in db.SiteConfigLanguages on
                       lang.Code equals site.LanguageCode
                       select lang;

Это должно привести к простому SQL (хотя в данном примере это бессмысленно):

SELECT Language.* FROM Language LEFT JOIN SiteConfigLanguage ON Language.Code = SiteConfigLanguage.LanguageCode;

Сбой внутри той же функции VisitMemberAccess, что и (в данном случае) язык не распознаваемого типа объявления (т. Е. String или DateTime). Это очень похоже на описание @matware, приведенное выше, однако звучит так, как будто член «IsValid» является чистым кодом C #, тогда как в этом случае lang.Code - это просто ссылка на столбец в базе данных.

В настоящее время я изучаю обходные пути, поскольку это только часть более крупного запроса LINQ, который мне не удался; если я найду что-нибудь, я опубликую это здесь. В противном случае, известны ли другие решения / обходные пути для этой проблемы?

ОБНОВЛЕНИЕ: игнорировать меня здесь; это просто из-за того, что я пропустил простую строку в операторе LINQ; вам необходимо убедиться, что вы используете ключевое слово "into" для завершения!

т.е.

    var list = from lang in db.Languages
               join site in db.SiteConfigLanguages on
               lang.Code equals site.LanguageCode into sl
               from siteLang in sl.DefaultIfEmpty()
               select lang;

У меня есть еще одна ошибка, но, по крайней мере, это исключение разрешено. Следующий, к сожалению, выглядит немного неприятнее (внутри библиотеки System.Linq).

0 голосов
/ 08 октября 2009

На самом деле я понимаю, что преодолел свою проблему, выполнив

Stuff.All (). Где (x => x.Someid == id) .ToArray () .AsQueryable () .Where (x => x.SomeProp.SomeFlag == true);

Это грубо, но это работает.

0 голосов
/ 08 октября 2009

Я получаю эту ошибку, когда добавляю свойства в мои модели (свойство IsValid, как упомянуто в ASP.Net MVC 1.0, спасибо Робу). У меня эта проблема была включена и выключена на некоторое время, и я думаю, что я прибил ее к разработчику запросов, пытающемуся создать запрос для чего-то, что должно быть сделано в коде, а не в TSQL.

Когда он пытается сгенерировать SQL, он спускается по пути, чтобы сгенерировать TSQL через VisitMemberAccess для сложного типа (возможно, другой модели), но он знает только, как выполнять операции с datetime и строками в VisitMemberAccess. Извините, если это немного бессвязно, но я пытаюсь обдумать это.

Чтобы обойти это, рассмотрите возможность использования чего-либо вроде LinqKit AsExpandable перед любой операцией, которая будет генерировать TSQL. Я пробовал это на простом OrderBy, который шел с треском, и он, кажется, работает, но я пока не знаю, что он будет делать с производительностью.

...