EntityFramework中的“where”语句的通用查询 [英] Generic query in EntityFramework with 'where' statement

查看:140
本文介绍了EntityFramework中的“where”语句的通用查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



这是我的代码时刻:

  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(异常)
{

throw;
}
}

错误:



'entity.Average_FK'无法在当前范围或上下文中解析。确保所有引用的变量都在范围内,所需的模式被加载,并且该命名空间被正确引用。成员访问表达式,第1行,第58列。



生成的查询: strong>



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



我检查了实体的属性,我确实有一个叫Average_FK。



任何想法如何实现我的目标? / p>

更新



我正在尝试实现一个泛型,如下所示: p>

 表达式< Func< TEntity,bool>> customFilter = entity => ComparePropertyValue< TEntity>(entity,foreignKey,valueFK); 

var query = objectContext.CreateQuery< TEntity>([+ name +])其中(customFilter);

....

  private static bool ComparePropertyValue< TEntity>(TEntity entity,string property,object value)
{
try
{
PropertyInfo propertyInfo = typeof(TEntity) .GetProperty(属性);
return propertyInfo.GetValue(entity)== value;
}
catch(异常)
{

throw;
}
}

此异常:



LINQ to Entities不识别方法'Boolean ComparePropertyValue [VW_Average_Client](XXX.EntityModel.VW_Average_Client,System.String,System.Object )'方法,这种方法不能转换为存储表达式。




解决方案

最后我找到了一个解决方案。



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

  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 +])。

foreach(查询中的var元素)
{
//任何
}

objectContext.SaveChanges();
}
catch(异常)
{

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(异常)
{

throw;
}
}


I need to create a generic method to fetch some data related to another entity.

This is how my code looks like at the moment:

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

And the error:

'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.

Generated query:

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

I checked the Properties of the Entity and I do have one called "Average_FK".

Any idea how to achieve my goal?

UPDATE

I am trying to implement a generic where like this:

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

And this 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.

解决方案

Finally I found a solution.

(In case someone wants to post a better/cleaner answer I will set yours as the valid one)

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

这篇关于EntityFramework中的“where”语句的通用查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆