Jon*_*ood 9 .net c# linq entity-framework
我想针对实体框架实现以下逻辑.
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;
}
由于TweakValue()在select条款中的调用,这将不起作用.我知道查询转换为SQL,问题是TweakValue()无法转换为SQL.我的问题是实现这一目标的最经济的方法是什么.我需要第二个循环来转换值吗?
我仍然试图熟悉LINQ表达式.
Jon*_*eet 12
最简单的方法可能是将执行"移动"到客户端以执行转换.在这种情况下,你只需使用:
var items = myContext.Select(item => new { item.Value1, item.Value2 })
                     .AsEnumerable()
                     .Select(item => new {
                                 Value1 = TweakValue(item.Value1),
                                 Value2 = TweakValue(item.Value2)
                             });
请注意,您不具有重用的名称Value1和Value2-这只是最简单的这样做.
如果您真的想使用查询表达式:
var query = from item in myContext
            select new { item.Value1, item.Value2 };
var items = from item in query.AsEnumerable()
            select new {
                Value1 = TweakValue(item.Value1),
                Value2 = TweakValue(item.Value2)
            };
如果你想先进行过滤,就可以得到该数据库中的通过将过滤,调用之前订购等发生AsEnumerable().例如:
var query = from item in myContext
            where item.Foo == bar
            orderby item.Something
            select new { item.Value1, item.Value2 };
var items = from item in query.AsEnumerable()
            select new {
                Value1 = TweakValue(item.Value1),
                Value2 = TweakValue(item.Value2)
            };
你不需要循环,只需要另一个投影:
var items =  myContext.Select(i => new {
                 Value1 = item.Value1,
                 Value2 = item.Value2
             })
             .AsEnumerable()
             .Select(i => new {
                 Value1 = TweakValue(item.Value1),
                 Value2 = TweakValue(item.Value2)
              });
编辑:根据TweakValue实际操作,您可以将整个操作推送到服务器.重复你当前的例子:
public Expression<Func<Item, ItemProjection>> TweakValue()
{
    return item => new ItemProjection 
                   {
                       Value1 = item.Value1,
                       Value2 = item.Value2 + 0 // or something else L2E can understand...
                   }; 
}
现在使用它像:
var exp = TweakValue();
var items =  myContext.Select(exp);
注意我存储exp在一个变量中,以便L2E不会尝试直接TweakValue在查询中调用,这将失败.
当然,只有TweakValueL2E可以做的事情才有效.
| 归档时间: | 
 | 
| 查看次数: | 9901 次 | 
| 最近记录: |