比如我有
class Foo: INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
public int Bar {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我可以在编译时获取Foo类AST并重写Bar
public string Bar
{
get { return this.bar; }
set
{
if (value != this.bar)
{
this.phoneNumberValue = value;
PropertyChanged(this, new PropertyChangedEventArgs("Bar"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
.
我想针对实体框架实现以下逻辑.
var items = from item in myContext
select new {
Value1 = TweakValue(item.Value1),
Value2 = TweakValue(item.Value2)
};
protected int TweakValue(int value)
{
// Custom processing here
return value;
}
Run Code Online (Sandbox Code Playgroud)
由于TweakValue()
在select
条款中的调用,这将不起作用.我知道查询转换为SQL,问题是TweakValue()
无法转换为SQL.我的问题是实现这一目标的最经济的方法是什么.我需要第二个循环来转换值吗?
我仍然试图熟悉LINQ表达式.
让我们说我有一种特殊的方式来决定某些字符串是否"匹配",如下所示:
public bool stringsMatch(string searchFor, string searchIn)
{
if (string.IsNullOrEmpty(searchFor))
{
return true;
}
return searchIn != null &&
(searchIn.Trim().ToLower().StartsWith(searchFor.Trim().ToLower()) ||
searchIn.Contains(" " + searchFor));
}
Run Code Online (Sandbox Code Playgroud)
我想使用Linq To Entities和这个帮助器从数据库中提取匹配项.但是,当我尝试这个:
IQueryable<Blah> blahs = query.Where(b => stringsMatch(searchText, b.Name);
Run Code Online (Sandbox Code Playgroud)
我得到"LINQ to Entities无法识别方法......"
如果我重新编写代码:
IQueryable<Blah> blahs = query.Where(b =>
string.IsNullOrEmpty(searchText) ||
(b.Name != null &&
(b.Name.Trim().ToLower().StartsWith(searchText.Trim().ToLower()) ||
b.Name.Contains(" " + searchText)));
Run Code Online (Sandbox Code Playgroud)
这在逻辑上是等价的,那么事情就可以了.问题是代码不是可读的,我必须为我想要匹配的每个不同实体重新编写代码.
至于我从这个问题中可以看出,我现在想做的事情是不可能的,但我希望我错过了什么,是吗?