Tôi gặp sự cố trong đó tôi đã thay đổi nguồn dữ liệu của mình từ một bindingsource thành truy vấn khung thực thể.
var query = dataSource as IQueryable;
var value = query.Where("prop = @0", value).Cast<object>().SingleOrDefault();
Với khung thực thể, trường hợp này ném ngoại lệ 'Không thể nhập' khách hàng 'để nhập' đối tượng '. LINQ to Entities chỉ hỗ trợ đúc các kiểu nguyên thủy hoặc liệt kê EDM.
Lớp mà mã của tôi không có tham chiếu đến lib với mô hình vì vậy ...Cast<customer>
là không thể.
Dù sao tôi đã sử dụng phương pháp này
var query = dataSource as IQueryable;
var targetType = query.GetType().GetGenericArguments()[0];
var value = query.Where("prop = @0", value).SingleOrDefault(targetType);
kết hợp với một phần mở rộng IEnumerable trong đó sử dụng phản ánh
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();
}
cảm thấy tự do để thực hiện bộ nhớ đệm cho mỗi loại để cải thiện hiệu suất.
Nguồn
2017-09-07 15:44:20
Tại sao bạn không sử dụng chung 'IEnumerable 'do đó' ImageList' có thể lấy được từ' IEnumerable '? –
@Arnis: vì ImageLIst defien trong thư viện ImageMagick.net ... :) –