我正在尝试构建一个过滤器表达式来过滤数据库中的数据.
我编写了以下扩展来动态构建表达式,具体取决于所选的过滤器参数:
public static Expression<Func<T, bool>> And<T>(
this Expression<Func<T, bool>> leftExpression,
Expression<Func<T, bool>> rightExpression)
{
var invocationExpression = Expression.Invoke(rightExpression, leftExpression.Parameters.Cast<Expression>());
var andExpression = Expression.Lambda<Func<T, bool>>(
Expression.AndAlso(leftExpression.Body, invocationExpression),
leftExpression.Parameters);
return andExpression;
}
Run Code Online (Sandbox Code Playgroud)
我正在以这种方式使用它:
Expression<Func<MyObject, bool>> expression = x => true;
if(MyFilter.SomeParam) {
expression = expression.And(x=>x.MyProperty == MyFilter.SomeParam);
}
Run Code Online (Sandbox Code Playgroud)
它适用于NHibernate,但是当我在Entity Framework 5中使用此代码时,它会失败,并显示以下异常消息:
LINQ to Entities不支持LINQ表达式节点类型"Invoke".
有一种解决方法从数据库中提取整个集合,然后通过IEnumerable.Where(Func<T1, T2> filterClause)它应用过滤条件,但它不需要所有数据只是为了获得一条记录,而Expression<Func<T1, T2>>表达式直接转换为SQL语句.
是否有任何简单的方法可以使此代码与Entity Framework一起使用?
我有一个小问题:
例如,我正在使用.NET Framework中的System.IO.File.Copy()方法.此方法是WinAPI的CopyFile()函数的托管包装器.但CopyFile函数如何工作?它与HDD的固件交互,或者可能通过Assembler或其他一些其他操作执行其他操作......
从最高级别到最低级别看起来如何?
我对词典有疑问,希望你能帮助我.
我有以下声明:
class MainCollection<TKey1, TKey2, TValue> : Dictionary<KeyValuePair<TKey1, TKey2>, TValue>
Run Code Online (Sandbox Code Playgroud)
问题是我无法通过TKey1 或 TKey2 从这本词典中获取一个元素.有没有办法只通过TKey1或TKey2获得一个元素,而不是TKey1和TKey2?
我写了以下代码:
public TValue GetItemByKey1(TKey1 key)
{
MainCollection<int, int, string> Coll = new MainCollection<int, int, string>();
var value = from s in Coll where s.Key.Key == key select s.Value;
}
Run Code Online (Sandbox Code Playgroud)
但它已经有两个问题:
我该如何解决这些错误?我在这里找不到任何相关的问题.提前致谢!
c# ×2
collections ×1
dictionary ×1
file-copying ×1
filter ×1
hardware ×1
low-level ×1
winapi ×1