我有一個問題,我將數據源從bindingsource更改爲實體框架查詢。
var query = dataSource as IQueryable;
var value = query.Where("prop = @0", value).Cast<object>().SingleOrDefault();
使用實體框架,會拋出一個異常`無法將類型'customer'強制類型轉換爲'object'。 LINQ to Entities僅支持投射EDM基元或枚舉類型。
我的代碼所在的類沒有對模型庫的引用,所以...Cast<customer>
是不可能的。
反正我用這種方法
var query = dataSource as IQueryable;
var targetType = query.GetType().GetGenericArguments()[0];
var value = query.Where("prop = @0", value).SingleOrDefault(targetType);
與此相關,使用反射
public static object SingleOrDefault(this IEnumerable enumerable, Type type)
{
var method = singleOrDefaultMethod.Value.MakeGenericMethod(new[] { type });
return method.Invoke(null, new[] { enumerable });
}
private static Lazy<MethodInfo> singleOrDefaultMethod
= new Lazy<MethodInfo>(() =>
typeof(Extensions).GetMethod(
"SingleOrDefault", BindingFlags.Static | BindingFlags.NonPublic));
private static T SingleOrDefault<T>(IEnumerable<T> enumerable)
{
return enumerable.SingleOrDefault();
}
隨時實現每種類型的緩存來提高性能的IEnumerable的擴展。
爲什麼你不使用通用'IEnumerable'所以'ImageList'可能來自'IEnumerable '? –
2010-02-23 09:57:42
@Arnis:因爲ImageLIst defien在ImageMagick.net庫... :) – 2010-02-23 10:00:40