我需要创建一个通用方法来获取与另一个实体相关的一些数据。
这就是我的代码目前的样子:
public static void InvalidateData<TEntity>(string foreignKey, int valueFK)
{
try
{
var key = typeof(TEntity).Name;
var adapter = (IObjectContextAdapter)EntityModelDataProvider.Database;
var objectContext = adapter.ObjectContext;
var container = objectContext.MetadataWorkspace.GetEntityContainer(
objectContext.DefaultContainerName, System.Data.Entity.Core.Metadata.Edm.DataSpace.CSpace);
var name = container.BaseEntitySets.Where((s) => s.ElementType.Name.Equals(key)).FirstOrDefault().Name;
string sqlQuery = String.Format(@"SELECT VALUE entity FROM [VW_{0}] WHERE entity.{1} = @foreignkey", name, foreignKey);
var query = objectContext.CreateQuery<TEntity>(sqlQuery, new ObjectParameter("foreignkey", valueFK));
var tmpResult = query.ToList();
}
catch (Exception)
{
throw;
}
}
错误:
&#39; entity.Average_FK&#39;无法在当前范围或上下文中解决。确保所有引用的变量都在范围内,加载了所需的模式,并正确引用了名称空间。近成员访问表达式,第1行,第58列。
生成的查询
SELECT VALUE entity FROM [VW_Average_Client] WHERE entity.Average_FK = @foreignkey
我检查了实体的属性,我确实有一个名为&#34; Average_FK&#34;。
知道如何实现我的目标吗?
更新
我正在尝试实现这样的通用:
Expression<Func<TEntity, bool>> customFilter = entity => ComparePropertyValue<TEntity>(entity, foreignKey, valueFK);
var query = objectContext.CreateQuery<TEntity>("[" + name + "]").Where(customFilter);
...
private static bool ComparePropertyValue<TEntity>(TEntity entity, string property, object value)
{
try
{
PropertyInfo propertyInfo = typeof(TEntity).GetProperty(property);
return propertyInfo.GetValue(entity) == value;
}
catch (Exception)
{
throw;
}
}
这个例外:
LINQ to Entities无法识别方法&#39; Boolean ComparePropertyValue [VW_Average_Client](XXX.EntityModel.VW_Average_Client,System.String,System.Object)&#39;方法,并且此方法无法转换为商店表达式。
答案 0 :(得分:2)
最后我找到了解决方案。
(如果有人想发布更好/更清洁的答案,我会将你的答案设为有效答案)
public static void InvalidateDataGeneric<TEntity>(string foreignKey, int valueFK)
{
try
{
var key = typeof(TEntity).Name;
var adapter = (IObjectContextAdapter)EntityModelDataProvider.Database;
var objectContext = adapter.ObjectContext;
var container = objectContext.MetadataWorkspace.GetEntityContainer(
objectContext.DefaultContainerName, System.Data.Entity.Core.Metadata.Edm.DataSpace.CSpace);
var name = container.BaseEntitySets.Where((s) => s.ElementType.Name.Equals(key)).FirstOrDefault().Name;
Func<TEntity, bool> filter = algo => ComparePropertyValue<TEntity>(algo, foreignKey, valueFK);
var query = objectContext.CreateQuery<TEntity>("[" + name + "]").Where(filter);
foreach (var element in query)
{
// whatever
}
objectContext.SaveChanges();
}
catch (Exception)
{
throw;
}
}
private static bool ComparePropertyValue<TEntity>(TEntity entity, string property, object value)
{
try
{
PropertyInfo propertyInfo = typeof(TEntity).GetProperty(property);
return propertyInfo.GetValue(entity).Equals(value);
}
catch (Exception)
{
throw;
}
}
答案 1 :(得分:0)
使用entity
的地方是错误的,应该是:
string sqlQuery = String.Format(@"SELECT VALUE FROM [VW_{0}] entity WHERE entity.{1} = @foreignkey", name, foreignKey);
甚至省略entity
:
string sqlQuery = String.Format(@"SELECT VALUE FROM [VW_{0}] WHERE {1} = @foreignkey", name, foreignKey);
(注意 - 我同意上面的评论,由于几个原因,这不是一种推荐的方法;有更好和更清洁的解决方案来达到同样的目的。但这不会回答这个问题......)< / em>的