将ADO.NET LINQ中的泛型类型属性与实体查询进行比较

时间:2017-07-28 22:13:59

标签: c# entity-framework linq ado.net linq-to-entities

目标

我试图在ADO.NET的LINQ to Entities中比较两种泛型类型的主键。诀窍是,我无法明确比较LINQ查询中的属性,因为我使用泛型类型。因此,我必须从两个对象动态检索属性的值,以便比较它们。

虽然我可以在应用程序端手动遍历数据库中的每一行(我当前的生产方法),但我仍然希望使用LINQ直接从数据库中检索。我想这会让事情变得简单。

问题

当尝试使用自定义帮助程序或与实体本身不直接相关的任何内容时,LINQ查询将失败,因为不受支持。我的理解是,在使用LINQ to Entities'时,实际的LINQ查询是使用SQL执行的。就这样,我对如何处理条件非常有限。

Disclamer

这不是我在询问如何在LINQ查询中使用方法。我现在概述的大部分内容将或多或少地为具有相同问题的未来访问者提供服务/问题。 我知道我不可能按照我尝试的方式处理这个问题。我的问题是,是否有一种创造性的方法来处理使用泛型类型的LINQ to Entities查询。我确定答案是“这是不可能的”,但我希望能够获得有关该主题的更多专业知识。也许有人曾尝试过这个。

异常

System.NotSupportedException: 'LINQ to Entities does not recognize the method
'Boolean CompareKeys[MyEntityType](System.Collections.Generic.List`1[System.String],
MyApp.DB.MyEntityType, MyApp.DB.MyEntityType)' method, 
and this method cannot be translated into a store expression.'

动作

private static void MergeEntityListToDB<T>(List<T> list)
{
    var primaryKeys = new List<string>() { "MyEntityTypeID" };
    foreach (var row in list)
    {
        T ExistingRecord = dbRows
            .Where(x => CompareKeys(primaryKeys, row, x)).FirstOrDefault();

        // Remaining Logic
    }
}

辅助

private static bool CompareKeys<T>(List<string> PKs, T obj1, T obj2)
{
    foreach (var key in PKs)
    {
        var val1 = obj1.GetType().GetProperty(key).GetValue(obj1, null).ToString();
        var val2 = obj2.GetType().GetProperty(key).GetValue(obj2, null).ToString();
        if (val1 != val2)
            return false;
    }

    return true;
}

1 个答案:

答案 0 :(得分:2)

我认为你需要结合LINQ Dynamic Query和可能的LINQKit来实现你的目标。 EF(和LINQ to SQL)无法将反射转换为SQL以查询数据库。