EntityFramework中的通用查询,其中'其中'声明

时间:2016-07-04 13:40:03

标签: c# sql entity-framework generics

我需要创建一个通用方法来获取与另一个实体相关的一些数据。

这就是我的代码目前的样子:

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;方法,并且此方法无法转换为商店表达式。

  

2 个答案:

答案 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>的