大家。 我知道,这个话题已经讨论过了。但是,遗憾的是,我在现有答案中找不到任何解决方案。所以,我有下一个代码:
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”运算符。我无法理解异常的原因。
有没有人有任何想法?我将不胜感激任何帮助。谢谢。
答案 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.
您打算如何使用此方法?