LINQ To SQL异常:本地序列不能用于LINQ to SQL实现

时间:2010-10-21 08:36:21

标签: c# sql linq

大家。 我知道,这个话题已经讨论过了。但是,遗憾的是,我在现有答案中找不到任何解决方案。所以,我有下一个代码:

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中,我有下一条消息的异常:
“除了Contains()运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现”。 我不在我的查询中使用“where”部分。所以我无法想象如何使用“Contains”运算符。我无法理解异常的原因。 有没有人有任何想法?我将不胜感激任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

尝试使用

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

这首先评估queriable的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.

您打算如何使用此方法?