c# - EntityFramework 中使用 'where' 语句的通用查询

标签 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;
    }
}

错误:

'entity.Average_FK' could not be resolved in the current scope or context. Make sure that all referenced variables are in scope, that required schemas are loaded, and that namespaces are referenced correctly. Near member access expression, line 1, column 58.

生成的查询:

SELECT VALUE entity FROM [VW_Average_Client] WHERE entity.Average_FK = @foreignkey

我检查了实体的属性,确实有一个名为“Average_FK”的属性。

知道如何实现我的目标吗?

更新

我正在尝试实现一个通用的地方,如下所示:

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;
    }
}

这个异常(exception):

LINQ to Entities does not recognize the method 'Boolean ComparePropertyValue[VW_Average_Client](XXX.EntityModel.VW_Average_Client, System.String, System.Object)' method, and this method cannot be translated into a store expression.

最佳答案

终于找到解决办法了。

(如果有人想发布更好/更清晰的答案,我会将您的答案设置为有效答案)

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;
    }
}

关于c# - EntityFramework 中使用 'where' 语句的通用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38186185/

相关文章:

c# - 在添加迁移期间忽略来自引用程序集的实体

c# - DDD 和 EF,在不同的限界上下文之间共享实体

c# - 两个字符串中的唯一字符对

c# - 在两台物理服务器上托管 ASP.NET MVC 项目

c# - 在 C# 中访问非泛型类型

mysql - 选择具有多个可能值的所有行

.net - 实体命令执行异常 : Invalid column name 'Entity_Id'

c# - 登录后 MVC 重定向

sql - 如何将sql字段值设置为等于同一个表中的另一个值

mysql - 基于动态日期的不同用户计数