Исключение LINQ To SQL: локальная последовательность не может использоваться в реализации LINQ to SQL - PullRequest
1 голос
/ 21 октября 2010

все.Я знаю, что эта тема уже обсуждалась.Но, к сожалению, я не нашел решения в существующих ответах. Итак, у меня есть следующий код:

public List<List<string>> DataTableParser(IQueryable<T> queriable)
    {
        //I missed the unnecessary code

        return queriable.Select(SelectProperties).ToList();

        //I missed the unnecessary code        
    }

    private Expression<Func<T, List<string>>> SelectProperties
    {
        get
        {
            var properties = typeof(T).GetProperties();
            // 
            return value => properties.Select
                                        (
                // empty string is the default property value
            prop => (prop.GetValue(value, null) ?? string.Empty).ToString()
                                        )
                                       .ToList();
        }
    }

Итак, в методе DataTableParser у меня есть исключение со следующим сообщением:
Msgstr "Локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains ()".Я не использую в моем запросе "где" часть.Поэтому я не представляю, как использовать оператор «Содержит».И я не могу понять причину исключения.У кого-нибудь есть какие-либо идеи?Я буду признателен за любую помощь.Благодарю.

1 Ответ

1 голос
/ 21 октября 2010

попробуйте использовать

return queriable.AsEnumerable().Select(SelectProperties).ToList();

это сначала оценивает sql запрашиваемого и создает в памяти объекты, которые затем будут обработаны отражением

linq to sql знает только, как перевести выражение в sql. Существует ограниченное количество выражений, которые можно перевести на SQL. свойства, которые представляют ваши столбцы, переводятся в sql.

queriable.Select(x=>x.MyColumn);
//is translatable to sql when there is a column that is named MyColumn in your table

queriable.Where(x=>x.MyColumn.Contains("X"))
//is translatable to sql as "...where MyColumn like '%X%' ..."

queriable.Select(x=> new { x.MyColumn, x.AnotherColumn})
//is translatable to sql for selecting multiple columns

queriable.Select(SelectProperties)
//is not translatable to sql because it does not return an expression that selects a single value, and its not an expression that returns a new object.

Как вы собираетесь использовать этот метод?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...