【发布时间】:2015-12-29 22:16:22
【问题描述】:
大家下午好! 我正在尝试用 SQL 翻译请求:
SELECT *
FROM TABLE1
WHERE TABLE1.ID IN (SELECT ID FROM TABLE2)
进入 LINQ to OData。
至于 ODAta 协议不支持“IN”,WHERE 部分必须像TABLE1.ID=1 OR TABLE1.ID=2 OR ...,
我尝试编写通用方法,该方法将 id 的输入列表作为输入,并以这种方式为 LINQ 返回正确的表达式:
public static Expression<Func<T,bool>> Lambda<T>(this Expression expr ,List<int> ids)
{
ParameterExpression argParam = Expression.Parameter(typeof(T), "rep");
Expression<Func<T, bool>> lambda = code => 1 == 0;
var lambdaPred = Expression.Lambda<Func<T, bool>>(lambda.Body, argParam);
var attr = (DataServiceKeyAttribute)typeof(T).GetCustomAttribute(typeof(DataServiceKeyAttribute));
string keyName;
try
{
keyName = attr.KeyNames.FirstOrDefault();//get name of key attribute
}
catch
{
return null;
}
foreach (int id in ids)
{
var property = typeof(T).GetProperty(keyName);
Expression<Func<T, bool>> lambdatemp = code => (int)property.GetValue(code) == id;
var tmp = Expression<Func<T, bool>>.Or(lambdaPred.Body, lambdatemp.Body);
lambdaPred = Expression.Lambda<Func<T, bool>>(tmp, argParam);
}
return lambdaPred;
}
这个方法的用法:
Expression<Func<Client, bool>> lambda = code => 1 == 0;
var query = lambda.Body.Lambda<Client>(ids);
var retr = clientRepository.Retrieve(query).ToList();
但在运行时出现错误:
“System.NotSupportedException”类型的异常发生在 Microsoft.Data.Services.Client.dll 但未在用户代码中处理
附加信息:表达式 (((((False 或 (Convert(Int32 Id.GetValue(code)) == 1044)) 或 (Convert(Int32 Id.GetValue(code)) == 8102)) 或 (Convert(Int32 Id.GetValue(code)) == 5997)) 或 (Convert(Int32 Id.GetValue(code)) == 7761)) 或 (Convert(Int32 不支持 Id.GetValue(code)) == 15455))。
你知道解决这个问题的方法吗?
【问题讨论】:
标签: c# linq expression odata